Синхронизировать WinForm с DatagridView - PullRequest
1 голос
/ 02 ноября 2009

У меня есть форма с DataGridView, который DataSource является BindingSource для таблицы. В этом представлении будет выделен отдельный ряд и кнопка для удаления, редактирования текущей выбранной строки во всплывающей форме и кнопка вставки, которая также будет использовать ту же форму.

У меня вопрос, как я могу синхронизировать всплывающую форму с текущей строкой?

Я попытался использовать событие RowStateChanged, чтобы получить и сохранить текущую выбранную строку, которая будет использоваться в форме, но я не могу. После события я получаю строку, которая была выбрана ранее.

Еще одна вещь, которую я пока не понимаю в C #, как иметь один набор записей и знать, какая запись является текущей, даже если ее новая вставка выполняется таким образом, что при вводе в форму все вводимые данные отображаются одновременно в DataGridView.

Ответы [ 2 ]

1 голос
/ 02 ноября 2009

Вам не нужно синхронизировать форму с текущей строкой. Вот для чего BindingSource.

Когда вы делаете простую привязку к BindingSource, то каждый раз, когда изменяется его текущий элемент, связанные элементы управления обновляются, и каждый раз, когда значения в связанных элементах управления меняются, базовые значения в связанном элементе обновляются. Когда вы выполняете сложное связывание (то есть привязанный элемент управления отображает список BindingSource, а не только текущий элемент), изменение Position в BindingSource также изменит текущую позицию в связанном элементе управления, и наоборот. Поэтому в этом случае вы хотите связать элементы управления во второй форме, используя простое связывание, а DataGridView - в первом, используя сложное связывание.

Единственное, что вам нужно сделать, это убедиться, что обе формы используют один и тот же BindingSource. Когда вы делаете это, нажатие на новую строку в DataGridView обновляет Position на BindingSource, и BindingSource выталкивает значения из текущего связанного элемента во все элементы с простыми связями, которые привязан к нему.

Это легко сделать. Предполагая, что Form1 - это форма с DataGridView, а Form2 - это форма с простыми элементами управления, сделайте следующее:

В форме 1:

private BindingSource Source = new BindingSource();

Form1_Load(object sender, EventArgs e)
{
    // set Source's DataSource to your DataTable here.
    mainDataGridView.DataSource = source;
    // create DataGridView columns and their bindings here.

    Form2 f2 = new Form2();
    f2.TopMost = true;
    f2.Source = Source;
    f2.Show();
}

В форме 2:

public BindingSource Source { get; set; }

public void Form2_Load(object sender, EventArgs e)
{       
    idTextBox.DataBindings.Add("Text", Source, "id");
    descriptionTextBox.DataBindings.Add("Text", Source, "description")
}
1 голос
/ 02 ноября 2009

Вы можете легко поддерживать синхронизацию, но не используя BindingSource.

Привязка данных Windows Forms построена на нескольких интерфейсах, наиболее важными из которых являются: IList и IBindingList. Первый отвечает только за предоставление доступа к элементам по их индексу в списке (чтобы сделать его проще), второй на самом деле более сложный.

IBindingList - (который реализован BindingSource) имеет методы для поддержки:

  • уведомление об изменении
  • добавление нового "пустого" элемента
  • сортировка
  • поиск

Важным для вас является уведомление об изменении курса. К сожалению, BindingSource не реализует этот бит кода. Здесь вы можете сделать 2 вещи - либо внедрить свою версию BindingSource с уведомлением об изменениях, либо попытаться связываться с событиями DGV и textboxes / comboboxes для обновления данных.

Лично я сделал первый (могу поделиться кодом, который у меня есть).

"Еще одна вещь, которую я пока не понимаю в C #, как иметь один набор записей и знать, какая запись является текущей, даже если ее новая вставка выполняется таким образом, что при вводе в форму все вводимые данные будут отображаться одновременно время в DataGridView. "

Каждая форма имеет объект BindingContext, который хранит CurrencyManagers - по одному для каждого источника данных. Таким образом, каждый элемент управления, связанный с одним и тем же источником данных, знает, какая запись является текущей. На самом деле, то, что делает BindingNavigator, связывается с соответствующим CurrencyManager и вызывает его методы. (Я понятия не имею, почему он требует BindingSource вместо минимального IList или для полной функциональности IBindingList)

...