5

にバインドされている System.Windows.Forms DataGridView がありますList<MyObject>
クラス MyObject には、DataGridView 内の DataGridViewCheckboxCell にバインドされたブール プロパティが含まれています。

public class MyObject
{
    public decimal DefaultValue {get; set; }
    public bool HasCustomValue {get;set; }
    public decimal CustomValue {get;set; }
    public decimal CurrentValue
    {
        get
        {
            return HasCustomValue
                ? CustomValue
                : DefaultValue;
        }
}

HasCustomValue別の (読み取り専用) プロパティの値を変更すると、その値もCurrentValue変更されます。これは、INotifyPropertyChanged イベントを実装することによって行われます (簡単にするために、その部分をソースの例に残しました)。

DataGridView の外部から変更した場合HasCustomValue、バインドされた列CurrentValueはすぐに更新されます。ただし、ユーザーがチェックボックスを有効または無効にHasCustomValueしても、マウスをクリックするか TAB キーを押して列を離れない限り、基になるデータソースでは変更されません。

チェックボックスの値を変更した後、グリッドがデータソースを直接更新するように強制する方法はありますか?

コントロールプロパティをバインドすると、に設定するDataSourceUpdateModeことWindows.Forms.DataSourceUpdateMode.OnPropertyChangedができますが、DataGridView でそのようなものは見つかりませんでした

4

5 に答える 5

2

私はこのトリックをしました:

  • 列の with CheckBox ReadOnly プロパティを true に設定します。
  • 次に、CellContentClick イベント ハンドラーで、プログラムによって値を反対の値に変更します。

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        int chkBoxColIdx = 0; //Index of the column with checkbox.
        if (e.ColumnIndex == chkBoxColIdx)
        {
            dataGridView1.Rows[e.RowIndex].Cells[chkBoxColIdx].Value = !(bool)dataGridView1.Rows[e.RowIndex].Cells[chkBoxColIdx].Value;
        }
    
于 2013-10-10T15:04:07.253 に答える
2

同様の問題がありました。そして、私は を使用していませんでしBindingSourceBindingList。多くのフラストレーションと実験 (そしてうまくいかなかったさまざまな解決策に従う) の後、

私は単にこれをしました:

  • DataGridViewCellMouseUpイベントをオーバーライドします
  • イベントで、DataGridViewEndEdit()メソッドを呼び出します。
于 2012-09-07T16:19:18.837 に答える
2

私はあなたがバインディングソースを使用していると仮定し、チェックボックスクリックイベント/編集時に、

    BindingSource.EndEdit()
于 2011-01-03T18:24:06.667 に答える
1

ハンドラーを使用するdatagridview.CurrentCellDirtyStateChanged

private void datagridview_CurrentCellDirtyStateChanged(Object sender, EventArgs e)
{
    //_checkboxColumnIndex - index of your checkboxcolumn
    DataGridView dgv = (DataGridView)sender;
    if (_checkboxColumnIndex == dgv.CurrentCell.ColumnIndex &&
        dgv.Columns[_checkboxColumnIndex].GetType() == typeof(DataGridViewCheckBoxColumn) &&
        dgv.IsCurrentCellDirty == true)
    {          
        //Remember that here dgv.CurrentCell.Value is previous/old value yet
        YourObject.HasCustomValue = !(bool)dgv.CurrentCell.Value
    }

    dgv.CommitEdit(DataGridViewDataErrorContexts.Commit) //this will fire .CellEndEdit event
}
于 2014-01-04T06:57:12.333 に答える