5

DataGridView セルにカスタム コントロールがあります。チェックボックス項目 (CheckBoxComboBox) を含むコンボボックスです。ここに問題があります: 1. CheckBoxComboBoxes の 1 つを入力し、いくつかのチェックボックス項目をオフに選択します。CheckboxComboBox の Text は、チェックされた項目の csv 文字列です。2.空の(チェックされたアイテムがない)別のCheckboxComboBoxセルをクリックします

結果 : 新しいセルのテキストに古いセルのテキストが含まれます。CheckBoxComboBox セル、CheckBoxComboBox 以外のセル、CheckBoxComboBox セルの順にクリックすると、正しく機能します。

このドキュメントに基づいてカスタム DataGridViewCell を読み、実装しました: 方法: Windows フォーム DataGridView セルでコントロールをホストする

カスタム DataGridViewEditingControl を使用してデバッグすると、EditingControl.Tag が更新されていないように見えます。

したがって、EditingControl が再利用されていることに問題があると想定しています。

私が試したこと:

1. DataGridViewCell.Clone() をオーバーライドする

    public override object Clone()
    {
        DataGridViewCheckBoxComboBoxCell checkBoxComboBoxCell = base.Clone() as DataGridViewCheckBoxComboBoxCell;
        if (checkBoxComboBoxCell != null)
        {
            checkBoxComboBoxCell.Tag = this.Tag;
            checkBoxComboBoxCell.Values = this.Values;


        }
        return checkBoxComboBoxCell; 
    }

2. DataGridViewCell.DetachEditingControl() をオーバーライドする

public override void DetachEditingControl()
    {
        DataGridView dataGridView = this.DataGridView;

        if (dataGridView == null || dataGridView.EditingControl == null)
        {
            throw new InvalidOperationException("Cell is detached or its grid has no editing control.");
        }

        DataGridViewCheckBoxComboBoxCellEditingControl ctl = DataGridView.EditingControl as DataGridViewCheckBoxComboBoxCellEditingControl;
        if (ctl != null)
        {
            //Just trying different things
            ctl.EditingControlFormattedValue = String.Empty;
            ctl.Text = string.Empty;
            ctl.Tag = null;
            ctl.Items.Clear();
        }

        base.DetachEditingControl();
    }

この問題を解決する方法はありますか? ありがとう。

編集1

ここに DataGridViewCheckBoxComboBoxColumn クラスがあります

class DataGridViewCheckBoxComboBoxColumn : DataGridViewColumn
{
     public override object Clone()
    {
        DataGridViewCheckBoxComboBoxColumn that = (DataGridViewCheckBoxComboBoxColumn)base.Clone();

        return that;
    }

    private DataGridViewCheckBoxComboBoxCell _cell = null;
    public DataGridViewCheckBoxComboBoxColumn()
    {
        _cell = new DataGridViewCheckBoxComboBoxCell();
        base.CellTemplate = _cell;
    }

    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            // Ensure that the cell used for the template is a DateCell.
            if (value != null &&
                !value.GetType().IsAssignableFrom(typeof(DataGridViewCheckBoxComboBoxCell)))
            {
                throw new InvalidCastException("Must be a DataGridViewCheckBoxComboBoxColumn");
            }
            base.CellTemplate = value;
        }
    }

    public string Values
    {
        set
        {
            _cell.Tag = value;
            this.Tag = value;
        }
        get
        {
            return _cell.Tag.ToString();
        }
    }
}

EDIT 2 私の DataGridViewCheckBoxComboBoxCell は Paint() をオーバーライドします。このメソッドにブレークポイントを設定すると、セルをクリックすると 2 回呼び出されます。初めて呼び出されたとき、formattedValue は空です。ただし、2 回目は、formattedValue に前のチェックボックスコンボボックス セルの誤った文字列が含まれています。

protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
                                  DataGridViewElementStates cellState, object value, object formattedValue,
                                  string errorText, DataGridViewCellStyle cellStyle,
                                  DataGridViewAdvancedBorderStyle advancedBorderStyle,
                                  DataGridViewPaintParts paintParts)
    {}

なぜ 2 回呼び出され、2 回目の呼び出しで正しいセルに対して間違った書式設定の値が含まれているのですか?

4

1 に答える 1

2

理解した。問題は、DetachEditingControl() で CheckBoxItems をクリアする必要があることでした。

public override void DetachEditingControl()
    {
        DataGridView dataGridView = this.DataGridView;

        if (dataGridView == null || dataGridView.EditingControl == null)
        {
            throw new InvalidOperationException("Cell is detached or its grid has no editing control.");
        }

        DataGridViewCheckBoxComboBoxCellEditingControl ctl = DataGridView.EditingControl as DataGridViewCheckBoxComboBoxCellEditingControl;
        if (ctl != null)
        {
            ctl.CheckBoxItems.Clear();  //Forgot to do this.
            ctl.EditingControlFormattedValue = String.Empty;
        }

        base.DetachEditingControl();
    }
于 2013-01-14T21:19:53.167 に答える