Обновление строк, добавленных в несвязанный объект WinForms DataGridView, завершается молча - почему? - PullRequest
1 голос
/ 20 ноября 2011

Моя форма 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);

1 Ответ

0 голосов
/ 20 ноября 2011

Проблема в том, что вы пытаетесь очистить строки из события строки (RowEnter).Это почти наверняка вызовет исключение, которое вам нужно перехватить.

Основной проблемой является повторное связывание сетки данных.Я уверен, что вам не нужно делать это каждый раз, когда данные сохраняются.Максимум, что вам нужно сделать, - это сохранить содержимое конкретного клиента, которое находится в разделе подробностей.

Если ваш базовый источник данных поддерживает IBindingList, тогда все, что вам нужно сделать, это получить запись клиента из таблицы иобновите его значениями из формы.Привязка данных должна позаботиться об обновлении содержимого сетки.

См. Документацию MSDN в свойстве DataSource для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...