Моя форма Master / Detail использует несвязанный DataGridView для отображения списка клиентов, которые соответствуют главному разделу фильтра), выбирая строку (RowEnter) в DataGridView, заполняет подробный раздел значениями.У меня есть рабочая кнопка Сохранить, которая сохраняет форму, повторно связывает сетку данных и затем сбрасывает форму.Проблема заключается в обновлении DataGridView при изменении детализации, теперь метод связывания доходит до dataGridView1.Rows.Clear (), но затем не выдает ошибки.
Мне нужно получить форму для сохранения и сеткучтобы обновить, мне также нужно понять, почему то, что у меня сейчас есть, не работает.
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
DataGridViewCell dgc = dataGridView1["ID", int.Parse(e.RowIndex.ToString())];
Guid customerID = Guid.Parse(dgc.Value.ToString());
if (IsPageValid() && dataGridView1.Focused)
{
if (KeepChanges())
{
SaveForm();
BindDataGrid(string.Empty);
}
}
Customer = _customerRepo.GetByID(customerID);
BindCustomerDetails(Customer);
}
Идея состоит в том, что форма загружена и выбран клиент, некоторые детали в форме изменены изатем выбирается новый клиент (в сетке выбирается другая строка), и происходят незавершенные изменения.IsPageValid проверяет, будут ли данные в форме создавать действительного клиента.KeepChanges возвращает из MessageBox YesNo («Есть изменения в этой записи. Вы хотите сохранить их?»). Если пользователь нажимает кнопку «Да», вызывается SaveForm () для сохранения сведений.Затем вызывается BindDataGrid (string.Empty).Все хорошо до этого момента, BindDataGrid (string.Empty) вызывается для Form_Load (), но на этот раз, когда удаляется строка dataGridView1.Rows.Clear (), отладчик останавливается, и элемент управления не возвращается программе, ни один изкод после этой точки в методе выполняется, и я не могу понять, почему.
public void BindDataGrid(String filterText)
{
var customers = String.IsNullOrEmpty(filterText) ? _customerRepo.GetAll() : _customerRepo.GetFiltered(filterText);
dataGridView1.Rows.Clear();
dataGridView1.ColumnCount = 5;
dataGridView1.Columns[0].Name = "ID";
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[1].Name = "Name";
dataGridView1.Columns[2].Name = "Address";
dataGridView1.Columns[2].FillWeight = 300;
dataGridView1.Columns[3].Name = "Phone";
dataGridView1.Columns[3].FillWeight = 80;
dataGridView1.Columns[4].Name = "Mobile";
dataGridView1.Columns[4].FillWeight = 80;
foreach (var customer in customers)
{
String address = String.IsNullOrEmpty(customer.Address.Street) ? "no address" : String.Format("{0}, {1}, {2}, {3}", customer.Address.Street, customer.Address.Town, customer.Address.County, customer.Address.Postcode);
dataGridView1.Rows.Add(customer.ID, customer.ToString(), address, customer.Address.Phone, customer.Mobile);
}
}
Я попытался изменить это, чтобы использовать DataTable, установив DataBinding в null и используя объект DataBinding, но онипохоже, все сталкиваются с одной и той же проблемой.Кажется, что DataGridView не обновляет и не разрешает обновление.Насколько я могу судить, из файла designer.cs, похоже, нет ничего, что мешало бы мне:
// dataGridView1
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Location = new System.Drawing.Point(4, 4);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.ReadOnly = true;
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.Size = new System.Drawing.Size(736, 330);
this.dataGridView1.TabIndex = 5;
this.dataGridView1.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowEnter);