我处于这种情况:view image
空面板中堆叠了 5 个用户控件。
我有一个垂直菜单,其中有几个按钮,当我点击一个按钮时,我使用:BringToFront()
来显示它们。
private void Button1_Click(object sender, EventArgs e)
{
tabRandom1.BringToFront();
}
每个 usercontrol
包含 datagridview
和其他必须加载来自数据库的数据的 elements
,但我希望如果我单击 button1
,只是加载了 usercontrol1
的元素。
当我尝试时:
private async void UserControl1_Load(object sender, EventArgs e)
{
this.DataGridView1.DataSource = await GetDataAsync();
}
我得到一个异常(exception)@er-shoaib:
there is already an open DataReader associated with tis connection which must be closed first.
我正在寻找加载事件用户控件元素的最佳方式
最佳答案
您收到的错误清楚地表明您已经打开了 DataReader
。
您不能在一个连接中打开多个 DataReader
。
为了让你与数据库通信的代码更稳定,使用 using
编写代码,它会自动处理这样的对象:
using(SqlConnection con = new SqlConnection("..."))
{
con.Open();
using(SqlCommand cmd = new SqlCommand("...", con))
{
using(SqlDataReader dr = cmd.ExecuteReader())
{
while(dr.Read())
// Do the things
}
}
// Do not need close since connection will be disposed
}
或者如果你为整个类(class)打开了一个连接(就像我想你在那里做的那样)只是不要将 SqlConnection con = new Sql....
包装在 using
但其他人所做的一切你不会有任何问题期望不要忘记做 connection.Close()
。
我总是对 sql 连接中的每个组件使用 using
,这不会影响我的性能。
当您以这种方式重新组织代码时,您将摆脱这个问题,但一个建议是不要在有人打开表单时加载数据,因为您将加载它 5 次,用户可能只使用一个但更好的创建方法,如 RefreshData()
在您的 UC 中,在您执行 yourUserControl.BringToFront();
之前,您还执行 yourUserControl.RefreshData()
这样您将只加载它如果需要,您将始终拥有新鲜的数据,而且如果需要,您还可以通过简单的方法在任何地方刷新数据。
关于c# - 使用多个用户控件从 Mysql 数据库加载大数据的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063804/