Несвязанный столбец в привязанном dataGridView без значений ячейки
У меня есть datagridview, где все столбцы связаны за исключением одного столбца флажок. В OnLoad моей формы я просматриваю строки в моем dataGridView и устанавливаю DataGridViewCheckBoxCell.Value = true
для каждого ряда.
В конце моего OnLoad я проверил, что все установленные мной DataGridViewCheckBoxCell по-прежнему имеют значения, которые я им дал, но как только dataGridView отобразится, все выбранные значения и значения флажков, которые я установил, будут сброшены.
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);
}
}
}
}
}