"Type"と "Value"の列を持つDataGridViewがあります。ユーザーがデータ型を選択し、その型と互換性のある値を入力すると、いくつかの型(例えば、 "Text")は任意の文字列を受け入れます。他のタイプ(「はい/いいえ」など)は可能な値のリストに限定されています。各行について、「値」列のセルをフリーフォームタイプのテキストボックスまたはリストタイプのコンボボックスに設定します。 DataGridViewはDataTableにバインドされています。バインドされたデータソースを持つ空のDatagridviewセル
ユーザーが1つのタイプの値を入力した後、その行を現在の値が許可されていない別のタイプに切り替えると問題が発生します。何を試しても、私はValueセルをクリアできません。次に、コンボボックスをセルに割り当てると、セルの現在の値が互換性がないため、DataErrorが返されます。テキストボックスからコンボボックスにセルを変更する前に、値をクリアするにはどうすればよいですか?フォームコンストラクタで
public enum DataType
{
Text,
YesNo
}
public class IndexedItem
{
public string Name { get; set; }
public int ID {get; set; }
public string strID
{
get { return ID.ToString(); }
}
//constructors & other methods;
}
public static DataTable ParameterTable;
public List<IndexedItem> YesNoList;
(dgvInputsがDataGridViewのです):あなたはそれを "テキスト" に設定すると、任意のものを入力している場合は、その後、
private void dgvInputs_CurrentCellDirtyStateChanged(object sender, EventArgs e) {
if (dgvInputs.IsCurrentCellDirty) {
dgvInputs.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dgvInputs_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
if (e.RowIndex >= 0 && e.ColumnIndex == 0) {
var cb = (DataGridViewComboBoxCell)dgvInputs[0, e.RowIndex];
if (cb.Value != null && cb.Value != DBNull.Value) {
DataType Type = (DataType)cb.Value;
dgvInputs[1, e.RowIndex].Value = string.Empty;
dgvInputs.CommitEdit(DataGridViewDataErrorContexts.Commit);
switch (Type) {
case DataType.YesNo:
dgvInputs[1, e.RowIndex].Dispose();
var newBox = new DataGridViewComboBoxCell();
newBox.DisplayMember = "Name";
newBox.ValueMember = "strID";
newBox.DataSource = YesNoList;
dgvInputs[1, e.RowIndex] = newBox;
break;
default:
dgvInputs[1, e.RowIndex] = new DataGridViewTextBoxCell();
break;
}
}
}
}
:
ParameterTable = new DataTable("ParameterTable");
ParameterTable.Columns.Add("Type", typeof(DataType));
ParameterTable.Columns.Add("Value", typeof(string));
YesNoList = new List<IndexedItem>();
YesNoList.Add(new IndexedItem("Yes", 1));
YesNoList.Add(new IndexedItem("No", 0));
var D = (DataGridViewComboBoxColumn)dgvInputs.Columns[0];
D.ValueMember = "Value";
D.DisplayMember = "Display";
D.DataSource = new DataType[] {
DataType.Text,
DataType.YesNo
}.Select(x => new { Display = x.ToString(), Value = (int)x }).ToList();
BindingSource ParamSource = new BindingSource();
ParamSource.DataSource = ParameterTable;
dgvInputs.AutoGenerateColumns = false;
dgvInputs.DataSource = ParamSource;
dgvInputs.Columns[0].DataPropertyName = "Type";
dgvInputs.Columns[1].DataPropertyName = "Value";
とイベント"YesNo"に切り替えると、 "System.ArgumentException:DataGridViewComboBoxCellの値が無効です"というエラーが表示され、カーソルがセル上にあるときはいつでも再び表示されます。テキスト行に戻すと、元の値が再び表示されます。
問題は、値がParameterTableに保存されていると仮定していますが、元の値をクリアしてParameterTableに反映させることができません。私はstring.Empty
の代わりにnull
とDBNull.Value
を試しましたが、いずれも違いはありませんでした。変更を加えるために "CommitEdit"という行を追加しましたが、それでも違いはありませんでした。
編集: 結局のところ、問題は、私は、セル変更イベントに持っていたこのコードでした:
string Default = dgvInputs[4, e.RowIndex].Value as string;
// code switching out text box and combo box above
try
{
dgvInputs[4, e.RowIndex].Value = Default;
} catch (Exception e2) {
MessageBox.Show(e2.GetType().ToString());
}
アイデアは、可能な場合は、値を保持するためにされていた、と私が持っていました私が確信していなかったので、私がキャッチする必要があった特定の例外を私に示すためにメッセージボックス。しかし、明らかにこの割り当ては即座に例外を誘導しません。それはあとで起こるだけで、明らかに私が扱っていない他のイベント中に発生します。
このコードをサンプルに含めるべきだったことは、後で分かります。どのように私はそれを見落として今私は知らない。重要な情報を除外して野生のガチョウの追跡に導いたすべての人に私の謝罪。私はあなたの援助に感謝します。
DBType Type =(DataType)cb.Value;コンパイルされません。 –
私はコードをコピーし、いくつかのコンパイルエラーを修正し、実行し、両方のタイプを選択し、値を入力または選択し、エラーメッセージを表示しませんでした。 –
@LeiYang - 私は、例のコードをseverelly切り捨てて、 "DBType"を "DataType"に変更しようとしました。これは、私の名前を選んだ後でしか見つからなかったいくつかのストックライブラリに "DbType"それを混乱させたくありません。ここで切り捨てた例を試してみる必要があります。私がそうしようとはしなかったが、私は関連性のあるものを削除したかもしれない。 –