Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c:DataGridView自定义单元格丢失自定义属性_C#_Datagridview - Fatal编程技术网

C# c:DataGridView自定义单元格丢失自定义属性

C# c:DataGridView自定义单元格丢失自定义属性,c#,datagridview,C#,Datagridview,从这里开始,我制作了一个单选按钮类型column和cell的自定义DataGridViewColumn public class DataGridViewRadioButtonColumnEx : DataGridViewColumn { public DataGridViewRadioButtonColumnEx() { this.CellTemplate = new DataGridViewRadioButtonCell(); this.Rea

从这里开始,我制作了一个单选按钮类型column和cell的自定义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);
    }
}
在Visual Studio中: 右键单击您的属性->查找所有引用。
或者,您可以在GroupName的Setter中设置一个断点,并在调试过程中观察任何更改它的调用。

好的,但从您的示例中很难判断,因为Setter从未在其中被访问过。您确定它是在第一时间设置的吗?只有在初始化Setter时才能访问它row.Cells.Addnew DataGridViewRadioButtonCell{GroupName=g1}`
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);
    }
}
    public override object Clone()
    {
        var clone = (DataGridViewRadioButtonCell)base.Clone();

        clone.Checked = _checked;
        clone.GroupName = _groupName;
        clone.CellType = _cellType;

        return clone;
    }