2

私はまだC#に少し慣れていませんが、Winformsを使用しており、データソースに接続され、正しく入力されているDataGridViewを持っています。

実行時に ComboBoxColumn も追加しました。この ComboBoxColumn はデータソースに接続され、displaymember と valuemember が設定され、headertext が設定されてから、列がデータグリッドに追加されます。接続は正常に機能し、ユーザーがクリックすると、コンボボックスが期待どおりに設定されます。

ユーザーがグリッド内の新しい行を完了すると、明らかにコンボ ボックス内の項目が選択され、完了時に行全体がデータベースに更新されます。

私の質問は次のとおりです。このデータグリッドが再度開かれたり再描画されたりすると、データソース プロパティが原因でデータが入力されますが、空白のボックスではなく、最初に選択した VALUE をコンボボックス セルに表示するにはどうすればよいですか。DBから値を取得して値を入れるコードを知っています。その変数をコンボボックスの表示に入れることができれば理想的です。ユーザーが必要に応じて値を編集できるように、comboBox はまだデータ バインドされていることに注意してください。

通常のコンボ ボックス コントロールでは、.Text プロパティを設定するだけでよいことはわかっています。ただし、DataGridViewComboBox には同じプロパティがありません。

実際のデータ接続と、comboBoxColumn の追加のコードは次のとおりです。

    public void AddComboBoxColumn(DataGridView datagridName, DataTable table, string headerText, int columnIndex)
    {
        DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();

        GetDisplayAndValueMembers(table, headerText); //Calls method that gets the datasource, displaymember, valuemember depending on column

        column.DataSource = tableRef; //sets datasource to table referenced by column
        column.DisplayMember = displayMember; //sets displaymember
        column.ValueMember = valueMember; //sets valuemember

        column.HeaderText = headerText; //changes headertext to displayed text

        if (newColumnIndex == 0)
            datagridName.Columns.Add(column); //added to end of datagrid
        else
        {
            datagridName.Columns.RemoveAt(columnIndex);
            datagridName.Columns.Insert(newColumnIndex, column); //added in specific index if needed
        }
    }

これは、ドロップダウンのデータ接続を示しているだけです。明らかに、大量のコードで使用されている多くのメソッドがあります。しかし、これは問題なく機能するため、これは問題ではありません。以前に選択したアイテムをコンボボックスのテキストとして実際に表示するという問題についてどうすればよいかわかりませんか?

4

1 に答える 1

2

あなたが探しているのはのDataPropertyNameプロパティのようComboBoxColumnです。DataSourceこのプロパティは、 のDataGridViewと の選択された値との間のバインディングを作成しますComboBoxColumn

たとえば、コンボ ボックスに製品のリストが表示されているとします。に ProductId も含まれますDataGridView DataSource。このようなもの:

// There Orders is a data table coming from the db which includes the product id column 
dataGridView1.DataSource = Orders;

// You set up your column just the same, with the DisplayMember and ValueMember
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();         
GetDisplayAndValueMembers(table, headerText);
column.DataSource = tableRef; //sets datasource to table referenced by column
column.DisplayMember = displayMember; //sets displaymember
column.ValueMember = valueMember; //sets valuemember       
column.HeaderText = headerText; //changes headertext to displayed text   

//Now you also set the DataPropertyName
column.DataPropertyName = "ProductId"; // this is the name of a column or property from the grid datasource

dataGridView1.Columns.Add(column);

セットを使用すると、と のDataPropertyName間にデータバインディングができます。ComboBoxColumnDataGridView

ComboBoxColumn基になるデータ ソースにコンボ ボックス プロパティの値を絶対に含めることができない場合は、カスタム コード内でこのすべての保存と値の設定を処理する必要があります。

選択した値を設定するにDataGridViewComboBoxCellは、セルを選択してそのValueプロパティを設定するだけです。

dataGridView1.Rows["rowname"].Cells["columnname"].Value = valueFromDb;
于 2011-07-17T09:02:40.837 に答える