属性尚未初始化.刷新网格视图时显示

本文关键字:视图 显示 网格 刷新 初始化 属性 | 更新日期: 2023-09-27 18:33:56

我正在尝试用数据库中的数据填充dataGridView,它必须在加载表单时以及单击refreshButton时获取数据。

代码如下:

public partial class PhoneBookMainWindow : Form
{
    static public string connString = "Server=(local); Database=PhoneBook; Trusted_Connection=TRUE";
    public SqlConnection connection = new SqlConnection(connString);
    private void btnRefreshPhoneBook_Click(object sender, EventArgs e)
    {
        SqlCommand command = new SqlCommand("SELECT ID, contactName, jobTitle, currentAddress, workAddress, workPhone, cellPhone FROM ContactsInformations", connection);
        try
        {
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = command;
            DataTable dataSet = new DataTable();
            dataAdapter.Fill(dataSet);
            BindingSource bindingSrc = new BindingSource();
            bindingSrc.DataSource = dataSet;
            dataGridView1.DataSource = bindingSrc;
            dataAdapter.Update(dataSet);
        }
        catch (Exception x)
        {
            MessageBox.Show(x.Message);
            throw;
        }
    }
}

我在 Form loading & btn clicking 中使用相同的代码,它们在执行中正常工作,但是当我从数据库中删除一行时出现问题(通过单击delete btn使用查询然后单击展览来到我面前的refresh btn

属性尚未初始化.刷新网格视图时显示

您似乎面临的问题是您有多个代码块共享同一个SqlConnection对象。 撇开潜在的竞争条件不谈,这意味着他们中的任何一个都可能在另一个对象使用之前尝试处置该对象。

释放后,对象将不再处于可以使用它的状态。 具体在这种情况下,它不再设置.ConnectionString

从本质上讲,这种情况正在发生:

  • 类 A 初始化连接
  • 方法 A1 使用连接
  • 方法 A1 完成连接并处理它
  • 方法 A2 尝试使用该连接,但不能,因为它已释放

创建 SqlConnection 对象不是一个特别占用资源的过程,因此最好将其范围在本地限定为将使用它的代码。 像这样:

using (SqlConnection connection = new SqlConnection(connString))
{
    using (SqlCommand command = new SqlCommand("SELECT ID, contactName, jobTitle, currentAddress, workAddress, workPhone, cellPhone FROM ContactsInformations", connection))
    {
        try
        {
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = command;
            DataTable dataSet = new DataTable();
            dataAdapter.Fill(dataSet);
            BindingSource bindingSrc = new BindingSource();
            bindingSrc.DataSource = dataSet;
            dataGridView1.DataSource = bindingSrc;
            dataAdapter.Update(dataSet);
        }
        catch (Exception x)
        {
            MessageBox.Show(x.Message);
            throw;
        }
    }
}

我在这里做了两件事:

  1. SqlConnection对象是在方法内部创建的,而不是在类级别创建的。 这意味着除了此方法之外,什么都不会使用它。 (所以除了这个方法之外,没有什么可以破坏它。
  2. 我在using语句中包装了一些一次性对象,这是使用任何实现IDisposable的事物时的最佳实践。