2011-07-16 8 views
1

私はまだC#で​​新しくなっていますが、私はWinformsを使用しており、データソースに接続されているDataGridViewを正しく取得しています。動的に追加されたDataGridViewComboBoxColumnのcomboBoxセルのテキストを変更するにはどうすればよいですか?

また、実行時にComboBoxColumnを追加しました。このComboBoxColumnがデータソースに接続され、displaymemberとvaluememberが設定され、headertextが設定され、次にその列がDataGridに追加されます。接続はうまく動作し、ユーザーがcomboBoxをクリックしたときに期待どおりに入力されます。

ユーザーがグリッド内の新しい行を完了すると、ユーザーは明らかにcomboBox内のアイテムを選択し、完了すると行全体が自分のデータベースに更新されます。

私の質問は:このデータグリッドを再度開いたり、再描画したりすると、データソースプロパティのためにデータが取り込まれますが、コンボボックスのセルに空白のボックスではなく元々選択した値が表示されます。私はDBから値を取得し、値を入れるコードを知っています。理想的なのは、コンボボックスのディスプレイにその変数を配置できるかどうかです。 comboBoxはまだデータバインドされているので、ユーザーは希望すれば値を編集できます。

通常の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 
     } 
    } 

これは単にドロップダウンののdataconnectionを示します。明らかに、大量のコードで多くのメソッドが使用されています。しかし、これは正常に動作するので、問題ではありません。以前に選択したアイテムを実際にcomboBoxのテキストとして表示するという問題については、どうやって解決するのか分かりません。

+1

おそらく関連するコードを表示するために質問を強化しますか? –

答えて

1

DataPropertyNameのプロパティは、ComboBoxColumnです。このプロパティはDataGridViewDataSourceComboBoxColumnの選択値との間にバインディングを作成します。

たとえば、コンボボックスに表示される商品のリストがあるとします。その後、DataGridViewDataSourceにProductIdが表示されます。このような何か:

// 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; 
+0

これは完全に動作します! column.DataPropertyNameはそれを正確に解決しました。私はdataGridView.Valueステートメントを追加する必要はありませんでした。デビッドありがとうございました。 –

関連する問題