1

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++;
        }

しかし悲しいことに、それでもコンボボックスの値は設定されません。

このコードにはエラーや警告はありません。

セルに値を具体的に設定せずに、データバインディングに制御を任せて、その処理を実行したいと思います。しかし、それが私がしなければならないことなら、そうする必要があります...

4

1 に答える 1

0

うーん、あなたのコードは(私が見た限りでは)良さそうです。「dtFields」オブジェクトが正確に何であるかはわかりませんが、dataTableである必要があります。私はそれがどのように行われるべきかについての簡単な例をしました。見てみな:

public partial class Form1 : Form
{        
    public Form1()
    {
        InitializeComponent();
        dataGridView1.Columns.Add("column1", "Column name");
        dataGridView1.Columns.Add(CreateComboBox());
        //adding some rows:
        dataGridView1.Rows.Add("a");
        dataGridView1.Rows.Add("b");
    }

    private DataGridViewComboBoxColumn CreateComboBox()
    {
        DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
        {
            combo.Name = "comboColumn";
            combo.HeaderText = "Selection";
            combo.DataSource = GetDataForComboBox();
            combo.DisplayMember = "Name";
            combo.ValueMember = "Id";
        }
        return combo;
    }

    private DataTable GetDataForComboBox()
    {
        //this is your method to get the data from database

        //in my exmaple I will simply add some example data:
        DataTable table = new DataTable("ExampleData");
        table.Columns.Add("Id", typeof(int));
        table.Columns.Add("Name", typeof(string));
        table.Rows.Add(1, "Name 1");
        table.Rows.Add(2, "Name 2");
        table.Rows.Add(3, "Name 3");
        return table;
    }
}

このコードは機能し、同じことを試みます。データベースからdataTableに入力するだけです。しかし、必要に応じて、この正確なコードを試すことしかできません。そうすれば、それが機能することがわかります。

さよなら

于 2012-09-09T14:16:49.437 に答える