【问题标题】:update DataGridViewComboBoxColumn from another form从另一个表单更新 DataGridViewComboBoxColumn
【发布时间】:2015-12-01 12:23:55
【问题描述】:

我有以下代码来填充 DataGridViewComboBoxColumn

        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 的新手,在此先感谢您

【问题讨论】:

  • 你有一个主表单,另一个,非模态表单 formA 和第三个非模态表单 formB 吗?是这样的吗?
  • FormA 是包含 DataGridViewComboBoxColumn 的数据网格的主窗体,第二个窗体 FormB 是单击 addNewItem 按钮时显示的窗体。没有第三种形式
  • 好的。然后让 FormB 抛出一个事件。您不应直接从其他表单更新 mainform-elements,也不应创建交叉引用。相反,您在表单 b 上创建一个自己的事件,并在打开表单 B 时订阅它。您在表单 B 上抛出事件,(自定义事件参数也可用于传递要添加的新记录)向下传递到表单 A . formA 上的订阅事件处理程序将不得不更新网格。试试这个。好吗?
  • 我创建了一个新的DataGridViewComboBox实例并将FormA的实例添加到新的实例中,它解决了异常,但是,直到我关闭并重新打开FormA,新添加的值才会出现,任何帮助请问?
  • 谢谢,但是你能发一个示例代码吗?因为我是 C# 及其事件的新手.. 再次感谢您。

标签: c# visual-studio-2015 datagridviewcombobox


【解决方案1】:
  1. MainForm 是 Mainform.cs
  2. formB 是 FormB.cs 的实例
  3. FormB 是“FormB.cs”类

在表格B中:

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));

但是。但是当您打开表单B 时,您必须订阅该事件。 在 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.
}

还必须存在于您的 MainForm 中。

并且不要忘记取消订阅事件,在关闭formB后,相当于+=,但带有-=。

【讨论】:

  • 非常感谢,但是这会如何影响FormA中ComboBox的数据表?
  • 代码还没准备好,我要完成它,现在很忙,尽快完成这个sn-p。
  • 现在它应该做的工作,只要你的 formB 是 amodal (我认为,现在)。
  • 谢谢亲爱的,我已经按照你的建议放了代码,并进行了必要的修改,但我不明白在哪里放置 ItemAddedNotify(this,new ItemAddedEventArgs(itemID.ToString(), txtItemAr .Text));
  • 在哪里放置 ItemAddedNotify(this,new ItemAddedEventArgs(itemID.ToString(), txtItemAr.Text));
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
相关资源
最近更新 更多