Несвязанный столбец в связанном dataGridView не содержит значений ячеек

У меня есть datagridview, где все столбцы связаны, кроме одного столбца флажка. В моей форме OnLoad я просматриваю строки в своем dataGridView и устанавливаю DataGridViewCheckBoxCell.Value = true для каждой строки.

Я проверил в конце моего OnLoad, что все установленные мной DataGridViewCheckBoxCells по-прежнему имеют значения, которые я им дал, но как только dataGridView отображается, все выбранные значения и значения флажков, которые я установил, сбрасываются.


person BenCamps    schedule 19.06.2012    source источник
comment
Нет, это winforms, но я попытался установить значения ячеек после DataBindingComplete.   -  person BenCamps    schedule 20.06.2012


Ответы (1)


По-видимому, когда DataGridView становится видимым (Visible = true), вызывается OnBindingContextChanged, что приводит к сбросу внутреннего подключения к данным и сбросу значений во всех ячейках.

Поэтому вместо того, чтобы устанавливать значения ячейки в OnLoad моей формы, я устанавливаю VirtualMode = true в своей сетке данных и переопределяю OnCellValueNeeded, где я могу указать значение ячейки флажка по запросу.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace MyControls
{
public class SelectedItemsGridView : DataGridView
{
    private IList _SelectedItems;
    public IList SelectedItems 
    {
        get { return _SelectedItems; }
        set
        {
            _SelectedItems = value;
            ClearSelection();
            Refresh();
        }
    }

    public SelectedItemsGridView()
        : base()
    {
        SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        RowHeadersVisible = false;
        VirtualMode = true;
        ////Columns.Add(new DataGridViewCheckBoxColumn(false) { 
        //    AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
        //    HeaderText = "Select"});
    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();
        if (DesignMode == true) { return; }
        Columns.Insert(0, new DataGridViewCheckBoxColumn(false)
        {
            AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
            HeaderText = "Select"
        });
    }

    public bool IsItemSelected(object obj)
    {
        if (SelectedItems == null) { return false; }
        return SelectedItems.Contains(obj);
    }

    protected override void OnCellValueNeeded(DataGridViewCellValueEventArgs e)
    {
        base.OnCellValueNeeded(e);
        if (e.ColumnIndex == 0)
        {
            e.Value = IsItemSelected((this.DataSource as IList)[e.RowIndex]);
        }
    }

    protected override void OnCellContentClick(DataGridViewCellEventArgs e)
    {
        base.OnCellContentClick(e);
        if (e.RowIndex == -1) { return; }
        Object item = ((IList)DataSource)[e.RowIndex];
        if(e.ColumnIndex == 0)
        {
            var cellValue = this[e.ColumnIndex, e.RowIndex].Value;
            if (cellValue != null && (bool)cellValue == true)
            {
                SelectedItems.Remove(item);

            }
            else if (cellValue != null && (bool)cellValue == false)
            {
                SelectedItems.Add(item);
            }
        }
    }
}

}

person BenCamps    schedule 20.06.2012
comment
Похоже, у вас есть хорошее решение, но вам не нужно этого делать. В стандартном несвязанном столбце флажка будут храниться значения, которые вы программно установили либо в переопределенном методе OnLoad, либо в обработчике DataBindingComplete. Если вы хотите опубликовать код из своей формы, я или другие с радостью посмотрят, что происходит. - person David Hall; 20.06.2012
comment
Мой DataGrid находится в TabPage, и это может сделать DataGridView немного странным, но моя проблема заключалась не в том, что столбец флажка не содержал значения все время, это было просто, когда gridView перешел от невидимого к видимому для первый раз. Я могу убедиться, что значения столбца моего флажка устанавливаются до того, как я переключусь на tabPage, содержащую dataGridView, но когда dataGridView отображается, все значения ячеек столбца флажка возвращаются к нулю. После отображения dataGridView, когда я устанавливаю значения ячеек флажка, они сохраняют свои значения. - person BenCamps; 21.06.2012
comment
Ах хорошо - это имеет большое значение. Насколько я могу судить, это особенность сетки, которая очень близка к ошибке (я видел сообщения от менеджера проекта DGV с просьбами сообщить об ошибках, связанных с этим). Сетка не привязывается к данным, пока она не станет видимой - когда она привязывается к данным, это стирает ваши данные в ней. Я могу придумать два варианта: внесение изменений в обработчик DataBindingComplete работает, и вы также можете добавить столбец для проверок в свой источник данных. - person David Hall; 21.06.2012
comment
Вау, спасибо вам обоим большое! Я был очень сбит с толку, потому что добавлял несвязанный DataGridViewCheckBoxColumn и инициализировал все значения false. Позже в другой функции я проверял эти значения, и они всегда были null. Я не мог понять, как они были null, потому что я только что инициализировал их всех как false! Конечно же, между этими событиями мы делаем DataGridView видимым. Как вы узнали/выяснили, что отображение DataGridView уничтожает несвязанные значения? - person Derek; 02.12.2015
comment
Было бы неплохо, если бы в документации Microsoft упоминалась эта проблема? Как добавить несвязанный столбец в таблицу данных. Связанный элемент управления Windows Forms DataGridView - person Derek; 02.12.2015