这是我的函数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自动刷新,请一些机构解释为什么会发生这种情况
答案 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;
}
作为旁注,您应避免重复使用DbConnection
,DbCommand
和DbDataReader
个对象;这是一个麻烦的秘诀。只需在需要时创建新的,并在完成后处理它们(最简单的方法是在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。