C#を使用する
SQLを使用して、クエリの結果をデータテーブルに入力します。
次に、そのデータテーブルをソースとして使用するデータグリッドを作成しました。
データグリッドは、DataGridViewComboBoxColumnタイプの列ですでに構成されています。
Comboboxのデータソースは、行ごとに2つの文字列を持つ別のSQLロードデータテーブルです。1つの文字列は必要な実際の値であり、2番目の文字列はユーザーに表示される文字列です。
コンボボックスには2番目のデータテーブルからの情報が正しく入力され、値は希望どおりに機能します。データテーブルからデータを保存すると、コンボボックスの正しい情報が得られます。
保存したSQL情報をそのデータグリッドにロードし直そうとすると、問題が発生します。値がデータテーブルのアイテムにバインドされていないようです。
データグリッドの定義:
dgHeaders.DataSource = dtCSVHeaders;
dgHeaders.Columns["nIndex"].Visible = false;
if (!dgHeaders.Columns.Contains("colType"))
{
DataGridViewComboBoxColumn colType = new DataGridViewComboBoxColumn();
colType.HeaderText = "DB Field";
colType.DropDownWidth = 140;
colType.Width = 140;
colType.DataSource = dtFields;
colType.DataPropertyName = "szDBField";
colType.DisplayMember = "szVisualField";
colType.ValueMember = "szDBField";
colType.Name = "DB Field";
colType.DefaultCellStyle.NullValue = "--Select--";
dgHeaders.Columns.Add(colType);
}
最初に、列名colTypeをdataRowに入力していた値に設定しようとしましたが、うまくいかなかったようです。
データバインディングを機能させる方法がわからなかったので、セルを希望の値に強制しようと決心したので、データロードでこれを試しました。
... SQL load
foreach (DataRow drRow in dtLoad.Rows)
{
string szColumnName = drRow["szOrgColumnName"].ToString();
string szMatchName = drRow["szMatchColumn"].ToString();
DataRow drAdd = dtCSVHeaders.NewRow();
drAdd["nIndex"] = nLoop;
drAdd["szHeader"] = szColumnName;
dtCSVHeaders.Rows.Add(drAdd);
dgHeaders.Rows[nLoop].Cells[2].Value = szMatchName;
nLoop++;
}
しかし悲しいことに、それでもコンボボックスの値は設定されません。
このコードにはエラーや警告はありません。
セルに値を具体的に設定せずに、データバインディングに制御を任せて、その処理を実行したいと思います。しかし、それが私がしなければならないことなら、そうする必要があります...