0

TextBoxColumn を持つ DataGridView があります。セルをクリックして編集モードに入ることができるようにしたいのですが、ドロップダウンを実行すると、ユーザーが選択できるオプションが表示されます。ユーザーがこれらのオプションのいずれかを望まない場合は、編集できますセル (ドロップダウンがないかのように)。次に、ユーザーがセルを離れると、値 (入力した値または選択した値) が保存されます。

ユーザーが入力した選択肢をドロップダウン リストに追加する方法はたくさんありますが、これは私が望んでいるものではありません。ユーザーが自分で選択する前に、考慮すべきいくつかの一般的なオプションを用意したいだけです。

別の入力ダイアログをポップアップするボタンは必要ありません。列を ComboBoxColumn に変更したくありません。ドロップダウン矢印が常に表示されているかどうかは気にしません。

EditingContolShowing で TextBoxCell を ComboBoxCell に変更しようとしましたが、これは無意味な作業であることがわかりました。

これに関する提案はありますか?

4

2 に答える 2

1

使用できるオプションの 1 つはオートコンプリートです。これにより、DataGridViewTextCell で必要な動作のほとんどを模倣できますが、テキスト セルの入力時にすべてのオプションが表示され、セル タイプを ComboBox に変換する必要はありません。

これは、DataGridView EditingControlShowing イベントで処理できます。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
  if (e.Control is TextBox)
  {
    TextBox box = e.Control as TextBox;
    box.AutoCompleteCustomSource = new AutoCompleteStringCollection();
    box.AutoCompleteCustomSource.AddRange(new string[] { "Foo", "Bar", "Baz" });
    box.AutoCompleteMode = AutoCompleteMode.Suggest;
    box.AutoCompleteSource = AutoCompleteSource.CustomSource;
  }
}

オートコンプリートDGV

したがって、ユーザーはオプションを表示するためにテキストを入力する必要があります。テキストボックスに入ったときにすべてのオプションを表示する必要がある場合、これは最適なオプションではありません。しかし、それが他のすべての必要な動作 (推奨されるオプション、オプション以外のエントリを受け入れる、常に表示する必要はないなど) の二次的なものである場合、これは実行可能な解決策です。

編集

これは、次のすべての状況で機能しました。

  1. DataGridView はデータ バインドされています。

DataSource のバインド:

public BindingList<Example> Examples { get; set; }

this.Examples = new BindingList<Example>();
dataGridView1.DataSource = this.Examples;

Example は単純なクラスです。

public class Example
{
  public string First { get; set; }
  public string Last { get; set; }
  public string Test { get; set; }
}
  1. 列を手動で追加します。

空の列のみ:

DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
col.Name = "Extra";
col.HeaderText = "Extra";
this.dataGridView1.Columns.Add(col);
  1. 1と2を合わせたもの。
于 2015-02-05T18:09:38.683 に答える
1

ComboBox にしたいセルを DataGridViewComboBoxCell タイプに設定するだけです。

var cb1 = new DataGridViewComboBoxCell();
cb1.Items.Add("Yes");
cb1.Items.Add("No");
dgv.Rows[1].Cells[1] = cb1;

var cb2 = new DataGridViewComboBoxCell();
cb2.Items.Add("Blue");
cb2.Items.Add("Red");
dgv.Rows[3].Cells[1] = cb2;

次に、EditingControlShowing イベントを使用して DropDown のスタイルを変更し、編集できるようにします。

void dgv_EditingControlShowing(object sender,
                               DataGridViewEditingControlShowingEventArgs e) {
  ComboBox cb = e.Control as ComboBox;
  if (cb != null) {
    cb.DropDownStyle = ComboBoxStyle.DropDown;
  }
}

CellValidating イベントを使用して、まだそこにない型指定された項目をリストに追加します。

void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
  var cb = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
  if (cb != null && !cb.Items.Contains(e.FormattedValue)) {
    cb.Items.Add(e.FormattedValue);
    if (dgv.IsCurrentCellDirty) {
      dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
    dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue;
  }
}
于 2015-02-06T16:53:43.410 に答える