4

ポップアップメニューのセクション(詳細)と行を保持するDataGridViewのセクションを含むマスター/詳細レイアウトがあります。

ポップアップメニューの状態は、DataGridViewで選択された行が変更されたときに更新され、DGVの選択された行の状態はポップアップメニューが変更されたときに更新されます。

ポップアップメニューの値を変更しても、DataGridViewの行がすぐに更新されないことを除いて、これはすべて機能します。編集内容を表示するには、別の行を選択する必要があります。

これは、選択が変更されるまで編集がコミットされていないためだと思います。

私の質問は、ポップアップへの変更をDataGridViewにすぐに反映させるにはどうすればよいですか?

ポップアップメニューのSelectionChangeCommittedハンドラーでEndEdit()を呼び出すことを試みましたが、これは効果がありません。そもそもUndoメカニズムがないかのように振る舞うDataGridViewを作成できるテクニックに興味があります。理想的には、ソリューションは一般的であり、他のプロジェクトに移植可能です。

4

6 に答える 6

7

既存の回答はでうまく機能しているようBindingSourceです。私の場合、DataTable直接使用された場所ではDataSource、何らかの理由で機能しませんでした。

// Other answers didn't work in my setup...
private DataGridView dgv;

private Form1()
{
   var table = new DataTable();
   // ... fill the table ...
   dgv.DataSource = table;
}

髪を引っ張った後、BindingSource間接参照を追加せずに機能するようになりました。

// Add this event handler to the DataGridView
private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    dgv.BindingContext[dgv.DataSource].EndCurrentEdit();
}

private Form1()
{
   dgv.CellEndEdit += dgv_CellEndEdit;
   // ...
}
于 2017-02-09T02:18:30.967 に答える
4

これが何が起こっていたかです。答えは、ComboBoxインスタンスのプロパティにありました。DataSourceUpdateModeからに変更する必要がありましOnValidationOnPropertyChanged。意味あり。はDataGridView、データの現在の状態を示している可能性が非常に高いです。ComboBoxフォーカスが離れておらず、入力を検証していないため、データがまだ編集されていないだけでした。

皆様からのご回答ありがとうございました。

于 2012-09-17T19:14:30.090 に答える
3

これは私にとってうまく機能します:

private void CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    var dgw = (DataGridView) sender;
    dgw.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
于 2017-01-05T00:38:50.127 に答える
2

この拡張メソッドを使用します。これは、ComboBoxだけでなく、すべての列タイプで機能します。

        public static void ChangeEditModeToOnPropertyChanged(this DataGridView gv)
        {
            gv.CurrentCellDirtyStateChanged += (sender, args) =>
            {
                gv.CommitEdit(DataGridViewDataErrorContexts.Commit);
                if (gv.CurrentCell == null)
                    return;
                if (gv.CurrentCell.EditType != typeof(DataGridViewTextBoxEditingControl))
                    return;
                gv.BeginEdit(false);
                var textBox = (TextBox)gv.EditingControl;
                textBox.SelectionStart = textBox.Text.Length;
            };
        }

このメソッドは、変更が行われた直後にすべての変更をコミットします。

テキスト列がある場合、文字を入力すると、その値がDataSourceにコミットされ、セルの編集モードが終了します。

したがって、ユーザーがテキストのリマインダーを入力し続けることができるように、現在のセルは編集モードに戻り、カーソルの位置をテキストの終わりに設定する必要があります。

于 2013-07-31T07:39:49.327 に答える
0

DataGridView.EndEditメソッドを呼び出します。

于 2012-09-17T17:30:30.740 に答える
-1

以下が機能します

_dataGrid.EndEdit()

値を設定すると問題ありません。

于 2017-02-09T11:41:09.923 に答える