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

110
14

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

спросил(а) 2021-01-19T17:52:17+03:00 6 месяцев, 1 неделя назад
1
Решение
78

MainForm - Mainform.cs formB - это экземпляр FormB.cs FormB - это класс "FormB.cs"

В FormB:

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, где теперь вы обновляете(), вы просто поднимаете событие, а не обновление:

        ItemAddedNotify(this,new ItemAddedEventArgs(itemID.ToString(), txtItemAr.Text));

НО. Но когда вы открываете форму B, вы должны подписаться на это событие. В Mainform после создания формы B, но перед ее показом, вы должны:

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.

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

ответил(а) 2021-01-19T17:52:17+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема