在数据库操作返回`System.NullReferenceException`后更新Combobox

时间:2015-03-17 11:52:33

标签: c# winforms combobox nullreferenceexception

为了更新ComboBox代号为PartId的项目列表,我创建了一个方法PopulatePartyIdCombobox(),并在更新/删除/保存新项目到数据库后调用它,要在PartId中反映这些更改,它在同一Form1上运行良好。

为了在名为PopulatePartyIdCombobox()的其他表单上使用Add_Party,我使用Application.OpenForms建议here

以下是我使用的方式:

    if (System.Windows.Forms.Application.OpenForms["Add_Party"] != null)
        {

            (System.Windows.Forms.Application.OpenForms["Add_Party"] as Form1).PopulatePartyIdCombobox();


        }

来自Form1.cs

   public void PopulatePartyIdCombobox()
    {

        string str = "select CP_id from  tbl_partyinfo";
        command.Connection = connection;
        command.CommandText = str;

        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {

            PartId.Items.Add(reader[0]);

        }
        reader.Close();



    }

但调试时说:

An unhandled exception of type 'System.NullReferenceException' occurred Additional information: Object reference not set to an instance of an object.

这个错误不相关或者为什么会这样?

有没有其他替代方法,我可以在数据库更新后更新组合框。

3 个答案:

答案 0 :(得分:1)

从Form1创建一个'new'实例,或者只是将该方法放在一个公共静态类中,以避免所有这些代码将方法从另一个表单转换为表单

  1. 创建包含要使用的方法的表单的新实例
  2. 使用类型为ComboBox的参数创建方法(发送需要更新或填充数据的组合框的名称)
  3. 或者

    1. 创建公共类
    2. 在此类中声明一个方法,方法是:
    3. internal static void FillComboBox(ComboBox comboBoxName, string valueMember, string displayMember, string tableName)
          {
              SqlConnection connName = new SqlConnection();
              connName.ConnectionString = "YourSqlConnString";
              connName.Open();
              SqlDataAdapter SDA = new SqlDataAdapter("Select " + valueMember + " ," + displayMember + "  from " + tableName, connName);
              DataTable dt = new DataTable();
              SDA.Fill(dt);
              comboBoxName.ValueMember = valueMember;
              comboBoxName.DisplayMember = displayMember;
              comboBoxName.DataSource = dt;
              connName.Close();
          }
      

      您可以使用try,catch处理该方法,也可以像您想要的那样更改sql select语句

答案 1 :(得分:1)

我找到了你的问题

检查你的投射方式

(Application.OpenForms["Add_Party"] as Form1).PopulatePartyIdCombobox();

作为Form1?如何将Form Add_Party强制转换为Form1?

语句Application.OpenForms [“Add_Party”]查找名为Add_Party的已打开表单,如果存在则返回。所以喜欢..

Form1 _form1 = (Application.OpenForms["Form1"] as Form1);
_form1.PopulatePartyIdCombobox();

答案 2 :(得分:0)

但我做了简单的替代方法,我可以在数据库更新后更新组合框

在同一表单上创建退出按钮,即Add_Party并实例化Form1。这将确保PartIdForm1上的组合框)包含最新数据Form1 1}}来自退出事件。

   private void btnexit_Click(object sender, EventArgs e)
      {

        Form1 f1 = new Form1();
        f1.PopulatePartyIdCombobox();
        f1.Show();

        this.Close();
      }