обновить DataGridViewComboBoxColumn из другой формы

У меня есть следующий код для заполнения 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 и предлагает пользователю ввести имя и идентификатор для нового элемента. Но проблема в том, что вновь добавленный элемент не появляется в поле со списком, пока я не закрою и снова не открою 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, я получаю исключение, что поле не существует. Любая помощь, пожалуйста, я новичок в С# и Visual Studio, заранее спасибо


person jotnarta    schedule 01.12.2015    source источник
comment
Есть ли у Вас одна основная форма, другая, амодальная форма, форма А и третья амодальная форма, форма Б? Это так?   -  person icbytes    schedule 01.12.2015
comment
FormA — это основная форма, содержащая сетку данных, которая содержит DataGridViewComboBoxColumn , а вторая форма FormB — это форма, отображаемая при нажатии кнопки addNewItem. Нет третьей формы   -  person jotnarta    schedule 01.12.2015
comment
Ok. Затем заставьте FormB генерировать событие. Вы не должны напрямую обновлять элементы основной формы из других форм, а также не должны создавать перекрестные ссылки. Вместо этого вы создаете собственное событие в форме b и подписываетесь на него при открытии формы B. Вы бросаете событие в форму B (аргументы пользовательских событий также могут использоваться для передачи новой добавляемой записи) в форму A Затем подписанный обработчик событий на formA должен будет обновить сетку. Попробуй это. Ok ?   -  person icbytes    schedule 01.12.2015
comment
Я создал новый экземпляр DataGridViewComboBox и добавил экземпляр FormA в новый, он разрешил исключение, но, тем не менее, новое добавленное значение не появляется, пока я не закрою и снова не открою FormA, помогите, пожалуйста?   -  person jotnarta    schedule 01.12.2015
comment
Спасибо, но не могли бы вы опубликовать пример кода для этого? потому что я новичок в C# и его событиях. Еще раз спасибо.   -  person jotnarta    schedule 01.12.2015


Ответы (1)


  1. MainForm — это Mainform.cs
  2. formB является экземпляром FormB.cs
  3. FormB — это класс FormB.cs.

В форме Б:

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.
}

также должен существовать в вашей основной форме.

И не забудьте отписаться от события, после закрытия formB, эквивалент +=, но с -=.

person icbytes    schedule 01.12.2015
comment
Большое спасибо, но как это может повлиять на таблицу данных ComboBox в FormA? - person jotnarta; 01.12.2015
comment
Код еще не готов, мне нужно будет его доделать, я сейчас занят, закончу этот фрагмент как можно скорее. - person icbytes; 01.12.2015
comment
Теперь он должен выполнять работу, пока ваша форма B амодальна (как я думаю, сейчас). - person icbytes; 01.12.2015
comment
Спасибо, дорогая, я поставил код, как вы предложили, и сделал необходимые изменения, но я не понял, куда поставить ItemAddedNotify(this,new ItemAddedEventArgs(itemID.ToString(), txtItemAr.Text)); - person jotnarta; 01.12.2015
comment
куда поместить ItemAddedNotify(this,new ItemAddedEventArgs(itemID.ToString(), txtItemAr.Text)); - person jotnarta; 01.12.2015
comment
Замените свой фрагмент формы B на этот. - person icbytes; 02.12.2015