我在这种情况下:查看图像
空面板中堆叠了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();
}
我得到一个例外@er shoaib:
there is already an open DataReader associated with tis connection which must be closed first.
我正在寻找加载活动usercontrol元素的最佳方法
1条答案
按热度按时间xvw2m8pv1#
你得到的错误很明显是你已经打开了
DataReader
.不能打开多个
DataReader
在一个连接内。为了使您与数据库通信的代码更加稳定,请用
using
它会自动处理如下对象:或者,如果你打开了一个连接,比如说整个班级(就像我认为你在那里做的那样),只是不要 Package
SqlConnection con = new Sql....
内部using
但是其他人做的每件事你都不会有问题,不要忘记去做connection.Close()
.我总是用
using
对于sql连接中的每个组件,它不会影响我的性能。当您以这种方式重新组织代码时,您将摆脱这个问题,但有一个建议是不要在有人打开窗体时加载数据,因为您将加载它5次,并且用户可能只使用一个但更好的创建方法,如
RefreshData()
在你进入uc之前yourUserControl.BringToFront();
你也是yourUserControl.RefreshData()
通过这种方式,您将只在需要时加载它,而且您将始终拥有一个新的,而且您将有一个简单的方法来刷新数据,如果需要的话。