当我调用执行select查询并返回数据表对象的函数时,为什么我的DataGridView会自动刷新?

时间:2014-01-14 22:10:51

标签: c# visual-studio-2010 datagridview

这是我的函数runQuery它是一个名为Dconnection的classe的成员,它返回一个DataTable对象:

public DataTable runQuery(string qry)
    {
        dt.Clear();
        cmd.CommandText = qry;
        con.Open();
        rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        dt.Load(rdr);
        con.Close();
        return dt;
    }

这是按钮代码:

    Dconnection dcon = new Dconnection();
    DataTable dtable = new DataTable();
    private void btnFillDGV_Click(object sender, EventArgs e)
    {
        dtable = dcon.runQuery("select * from books");         
        DGV.DataSource = dtable;            
    }

    private void btnExecQuery_Click(object sender, EventArgs e)
    {
        dcon.runQuery("select * from books where ID =1");

    }

当我点击第一个按钮时,DataGridView被填充:

问题是当我点击第二个按钮时DGV自动刷新,请一些机构解释为什么会发生这种情况

3 个答案:

答案 0 :(得分:2)

您的runQuery方法未创建新的DataTable;它重用了已定义为DataTable源的同一DataGridView实例。因此,当您清除并重新填充它时,它会刷新DataGridView

要修复它,只需实例化一个新的DataTable

public DataTable runQuery(string qry)
{
    var table = new DataTable();
    cmd.CommandText = qry;
    con.Open();
    rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    table.Load(rdr);
    con.Close();
    return table;
}

作为旁注,您应避免重复使用DbConnectionDbCommandDbDataReader个对象;这是一个麻烦的秘诀。只需在需要时创建新的,并在完成后处理它们(最简单的方法是在using块中声明它们):

public DataTable runQuery(string qry)
{
    var table = new DataTable();

    using (var connection = new SqlConnection(connectionString))
    using (var cmd = con.CreateCommand())
    {
        cmd.CommandText = qry;
        connection.Open();
        using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            table.Load(rdr);
        }
    }
    return table;
}

答案 1 :(得分:0)

因为你的DataGridView有一个DataTable,因为它是DataSource,你正在清理并重新加载DataTable。

答案 2 :(得分:0)

因为你在两个按钮中操纵相同的dt

 DGV.DataSource = dtable;

在这里,您要将dataSource设置为dtable,这是从您的函数返回的值,这是您的数据表(dt)。在第二个按钮单击中,您将清除dt这是您的dataSource,并且您的数据网格视图正在刷新。为了防止这种情况,请在您的方法中定义新的DataTable

public DataTable runQuery(string qry)
{
    DataTable dt = new DataTable();
    cmd.CommandText = qry;
    con.Open();
    rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    dt.Load(rdr);
    con.Close();
    return dt;
}

不要忘记,类是引用类型,在这一行:

dtable = dcon.runQuery("select * from books");  

你在做:

dtable = dt;

因此,如果您在dt中进行了一些更改,则会影响您的数据源dtable。