C# 从其他表单更新DataGridViewComboxColumn
我有以下代码来填充DataGridViewComboBoxColumnC# 从其他表单更新DataGridViewComboxColumn,c#,visual-studio-2015,datagridviewcombobox,C#,Visual Studio 2015,Datagridviewcombobox,我有以下代码来填充DataGridViewComboBoxColumn try { itemReader = sc.ExecuteReader(); itemDT = new DataTable(); itemDT.Columns.Add("id", typeof(string)); itemDT.Columns.Add("ar_desc", typeof(stri
try
{
itemReader = sc.ExecuteReader();
itemDT = new DataTable();
itemDT.Columns.Add("id", typeof(string));
itemDT.Columns.Add("ar_desc", typeof(string));
itemDT.Load(itemReader);
itemIDcmbColmn.ValueMember = "id";
itemIDcmbColmn.DisplayMember = "ar_desc";
itemIDcmbColmn.DataSource = itemDT;
}
catch (Exception e)
{
MessageBox.Show("Exception - populateGridComboBox(): " + e.Message);
}
finally
它很好地填充组合框。我有一个按钮可以将新记录插入DataGridViewComboBoxColumn,它打开另一个表单FormB并提示用户输入新项的名称和ID。但问题是,在我关闭并重新打开FormA之前,新添加的项目不会出现在组合框中。这是我的FormB代码:
BindingSource bs = new BindingSource();
DataGridViewComboBoxColumn itemCmbClmn = prcFrm.itemIDcmbColmn; //Get FormsA DataGridViewComboBoxColumn
DataTable itemDataTable = prcFrm.ItemData; //Get FormA datatable
itemCmbClmn.ValueMember = itemID.ToString();
itemCmbClmn.DisplayMember = txtItemAr.Text;
bs.DataSource = itemDataTable;
itemCmbClmn.DataSource = bs;
prcFrm.dataGridView1.Update();
当我运行addNew时,我得到一个异常,该字段不存在。请帮忙,我是C#和visual studio的新手,提前谢谢你
public event ItemAdded ItemAddedNotify;
#region OwnEventsAndDelegates
public delegate void ItemAdded(object sender, ItemAddedEventArgs e);
public class ItemAddedEventArgs : EventArgs
{
string _valueMember;
public string ValueMember
{
get { return _ValueMember; }
set { _ValueMember = value; }
}
string _displaymember;
public string DisplayMember
{
get { return _displayMember; }
set { _displayMember = value; }
}
public ItemAddedEventArgs(string pValueMember, string pDisplaymember)
{
_valueMember = pValueMember;
_displayMember = pDisplaymember;
}
}
#endregion
稍后,在FormB中,您现在执行update(),只需引发事件,而不是更新:
ItemAddedNotify(this,new ItemAddedEventArgs(itemID.ToString(), txtItemAr.Text));
但是。但当你打开formB时,你必须订阅该活动。
在Mainform中,在实例化formB之后,但在显示它之前,您应该执行以下操作:
this.formB.ItemAddedNotify += new FormB.ItemAddedNotify(On_ItemAdded);
方法
On_ItemAdded(object sender, FormB.ItemAddedEventArgs e)
{
// Here You will have to add the stuff.
// IT MIGHT BE BETTER TO USE TYPED DATASETS/TABLES.
// It also might be, that the record will be visible ONLY after
// closing formB. Please let me know.
}
还必须存在于主窗体中
在结束formB后,不要忘记取消订阅活动,相当于+=,但有-=。您有一个主表单、另一个表单、amodal表单formA和第三个amodal表单formB吗?是这样吗?FormA是包含datagrid的主表单,datagrid包含DataGridViewComboBoxColumn,第二个表单FormB是单击addNewItem按钮时显示的表单。没有第三个formOk。然后让FormB抛出一个事件。您不应该直接从其他表单更新mainform元素,也不应该创建交叉引用。相反,您在表单b上创建自己的事件,并在打开表单b时订阅该事件。您将表单b上的事件(自定义事件参数也可用于传递要添加的新记录)下放到表单A。然后,表单A上的子描述事件处理程序必须更新网格。试试这个。好吗?我创建了DataGridViewComboBox的一个新实例,并将FormA的实例添加到新实例中,它解决了异常,但新添加的值在我关闭并重新打开FormA之前不会出现,请提供任何帮助?谢谢,但您可以发布一个这样做的示例代码吗?因为我是C#及其活动的新手。。再次感谢。非常感谢,但是这会如何影响表单中ComboBox的数据表?代码还没有准备好,我将不得不完成它,我现在很忙,将尽快完成这段代码。现在它应该完成工作,只要你的表单是amodal(我想,现在)。谢谢亲爱的,我已经按照你的建议放置了代码,并进行必要的修改,但我不知道将ItemAddedNotify放在何处(这是新的ItemAddedEventArgs(itemID.ToString(),txtItemAr.Text));在何处放置ItemAddedNotify(这是新的ItemAddedEventArgs(itemID.ToString(),txtItemAr.Text));