为了更新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.
这个错误不相关或者为什么会这样?
有没有其他替代方法,我可以在数据库更新后更新组合框。
答案 0 :(得分:1)
从Form1创建一个'new'实例,或者只是将该方法放在一个公共静态类中,以避免所有这些代码将方法从另一个表单转换为表单
或者
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
。这将确保PartId
(Form1
上的组合框)包含最新数据Form1
1}}来自退出事件。
private void btnexit_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
f1.PopulatePartyIdCombobox();
f1.Show();
this.Close();
}