c#:DataGridView自定义单元格丢失自定义属性
Posted
技术标签:
【中文标题】c#:DataGridView自定义单元格丢失自定义属性【英文标题】:c#: DataGridView custom cell lose custom property 【发布时间】:2013-09-27 10:29:52 【问题描述】:从link 开始,我制作了一个单选按钮类型(列和单元格)的自定义 DataGridViewColumn。
public class DataGridViewRadioButtonColumnEx : DataGridViewColumn
public DataGridViewRadioButtonColumnEx()
this.CellTemplate = new DataGridViewRadioButtonCell();
this.ReadOnly = true;
public delegate void RadioButtonClickedHandler(bool state);
public class DataGridViewRadioButtonCellEventArgs : EventArgs
bool _bChecked;
public DataGridViewRadioButtonCellEventArgs(bool bChecked)
_bChecked = bChecked;
public bool Checked
get return _bChecked;
public class DataGridViewRadioButtonCell : DataGridViewTextBoxCell
Point radioButtonLocation;
Size radioButtonSize;
bool _checked = false;
public bool Checked
get return _checked;
set _checked = value;
string _groupName = "";
public string GroupName
get
return _groupName;
set
_groupName = value;
Point _cellLocation = new Point();
System.Windows.Forms.VisualStyles.RadioButtonState _cbState = System.Windows.Forms.VisualStyles.RadioButtonState.UncheckedNormal;
public event RadioButtonClickedHandler OnRadioButtonClicked;
public DataGridViewRadioButtonCell()
protected override void Paint(System.Drawing.Graphics graphics, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates dataGridViewElementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
base.Paint(graphics, clipBounds, cellBounds, rowIndex, dataGridViewElementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
Point p = new Point();
Size s = RadioButtonRenderer.GetGlyphSize(graphics, System.Windows.Forms.VisualStyles.RadioButtonState.UncheckedNormal);
p.X = cellBounds.Location.X + (cellBounds.Width / 2) - (s.Width / 2);
p.Y = cellBounds.Location.Y + (cellBounds.Height / 2) - (s.Height / 2);
_cellLocation = cellBounds.Location;
radioButtonLocation = p;
radioButtonSize = s;
if (_checked)
_cbState = System.Windows.Forms.VisualStyles.RadioButtonState.CheckedNormal;
else
_cbState = System.Windows.Forms.VisualStyles.RadioButtonState.UncheckedNormal;
RadioButtonRenderer.DrawRadioButton(graphics, radioButtonLocation, _cbState);
protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
Point p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);
if (p.X >= radioButtonLocation.X && p.X <= radioButtonLocation.X + radioButtonSize.Width && p.Y >= radioButtonLocation.Y && p.Y <= radioButtonLocation.Y + radioButtonSize.Height)
_checked = !_checked;
if (OnRadioButtonClicked != null)
OnRadioButtonClicked(_checked);
this.DataGridView.InvalidateCell(this);
base.OnMouseClick(e);
protected override void OnKeyUp(KeyEventArgs e, int rowIndex)
base.OnKeyUp(e, rowIndex);
if (e.KeyCode == Keys.Space)
_checked = true;
if (OnRadioButtonClicked != null)
OnRadioButtonClicked(_checked);
this.DataGridView.InvalidateCell(this);
/// <summary>
/// To Set the status of the Check-Box Header column
/// </summary>
/// <param name="flagIndicator">True - to mark checked state. False : To mark it as Unchecked.</param>
public void SetRadioButton(bool flagIndicator)
_checked = flagIndicator;
this.DataGridView.InvalidateCell(this);
它工作正常,我添加了名为“GroupName”的自定义属性(现在用于单选按钮所属的组)但在运行时,某处被清除。
public class CustomDataGridView : DataGridView
protected override void OnCellClick(DataGridViewCellEventArgs e)
if ((e.RowIndex > -1) && (e.ColumnIndex > -1))
if ((this[e.ColumnIndex, e.RowIndex]).OwningColumn is DataGridViewRadioButtonColumnEx)
DataGridViewRadioButtonCell cell = this[e.ColumnIndex, e.RowIndex] as DataGridViewRadioButtonCell;
cell.Checked = !cell.Checked;
if (((DataGridViewRadioButtonCell)cell).Checked)
for (int i = 0; i < this.RowCount; i++)
if (cell.GroupName == (this[e.ColumnIndex, i] as DataGridViewRadioButtonCell).GroupName)
(this[e.ColumnIndex, i] as DataGridViewRadioButtonCell).Checked = false;
base.OnCellClick(e);
this.InvalidateColumn(e.ColumnIndex);
如何检测属性 GroupName 被清除的位置?
谢谢。 剑道
乐: 我找到了!我必须重写克隆方法:
public override object Clone()
var clone = (DataGridViewRadioButtonCell)base.Clone();
clone.Checked = _checked;
clone.GroupName = _groupName;
clone.CellType = _cellType;
return clone;
【问题讨论】:
【参考方案1】:在 Visual Studio 中:
右键单击您的属性的出现 -> 查找所有参考。
或者,您可以在 GroupName
的 Setter 中放置一个断点,并观察在调试期间更改它的任何调用。
【讨论】:
好的,但是从您的示例中很难分辨,因为从未在其中访问过 Setter。你确定它是一开始就设置好的吗? Setter 只有在初始化时才被访问。 ` row.Cells.Add(new DataGridViewRadioButtonCell() GroupName = "g1" );`以上是关于c#:DataGridView自定义单元格丢失自定义属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在visual studio中自定义dataGridView单元格