1

次の方法で DataGridViewComboBoxCell の値を取得しようとしています

ComboBox に項目を追加する場合:

    public void LoadLayouts()
    {
        ImmutableSet<string> layoutNames = _store.Current.Keys;
        var dgvComboBox = (DataGridViewComboBoxColumn)this.schedulesDataGrid.Columns[1];

        foreach (string name in layoutNames)
        {
            dgvComboBox.Items.Add(name);
        }
    }

値を読み戻そうとする場合:

var combo = (DataGridViewComboBoxCell) this.schedulesDataGrid[args.ColumnIndex, args.RowIndex];
string LayoutChosen = (string)combo.Value;

しかし、ComboBox で値が選択されていることがわかりますが、Value は null としてFormattedValue返され、 は "" として返されます。

名前の配列を DataSource として設定しようとしましたが、単一の値 (レイアウトの名前) しかないことを考えると、表示メンバーと値メンバーに何を設定すればよいかわかりません。

考え?

4

1 に答える 1

0

セルの値を読み取ろうとした時点で、行は変更をコミットしていません。行ヘッダーが表示されている場合は、コミットされていない行に鉛筆アイコンが表示されます。これは通常、セルがフォーカスを失った後に発生します。インプレース編集コントロールコンボボックスにフックして、値が変更されたときにEndEditをポストするようにすると、問題を強制できます。

void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    var comboBox = e.Control as ComboBox;
    if (comboBox != null)
    {
        // remove any handler we may have added previously
        comboBox.SelectionChangeCommitted -= new EventHandler(comboBox_SelectionChangeCommitted);
        // add handler
        comboBox.SelectionChangeCommitted += new EventHandler(comboBox_SelectionChangeCommitted);
    }
}

void comboBox_SelectionChangeCommitted(object sender, EventArgs e)
{
    // Allow current dispatch to complete (combo-box submitting its value)
    //  then EndEdit to commit the change to the row
    dgv.BeginInvoke(new Action(() => dgv.EndEdit()));
}
于 2012-09-14T22:00:23.637 に答える