2016-07-11 5 views
0

作成者から手動で作成した4つの列を含むdatagridviewを用意しました。 1列目、2列目、3列目はテキストボックス列ですが、最後の列はcomboboxcolumnとしてマークされています。データソース付きのDataGridViewコンボボックスカラム

ユーザーは、ボタンをクリックすると行を追加できます。最初の3つの列の値は、いくつかのテキストボックスから来ています。問題は、ユーザーが自分の行を追加するときに、私はcombobx列に値を設定しなければならないということです。私がこれまでに試したのは、次のようなものでした:

内部でデータ取得可能なデータを取得するGetAll関数は、IdとNameです。 Idは、値メンバーとしてマークされ、表示メンバーとして名前が付けられます。

フォームツリーの最初の列のフィールドがいくつかのテキストボックスからいっぱいになり、最後のコンボボックスの列がGetAllのデータで埋められるようにするだけです。それを達成する方法?


Private Sub btnAddMatType_Click(sender As Object, e As EventArgs) Handles btnAddMatType.Click 

      try 
       Dim dt as DataTable 
       dt = New Variation().GetAll() 


       Dim cbo = CType(dgvMaterials.Columns(3), DataGridViewComboBoxColumn) 
       cbo.Items.AddRange(dt.AsEnumerable().Select(Function(s) s.Field(Of String)("Name")).ToArray()) 

       Dim rodzajID as String = TreeMaterials.SelectedValue 
       Dim rodzajName as string = TreeMaterials.SelectedNode.Text 
       Dim material as string = TreeMaterials.SelectedNode.Parent.Text 

       dgvMaterials.Rows.Add(material, rodzajName, rodzajID) 


Catch ex As Exception 
       msgbox(ex.ToString()) 
End Try 

dtはデータが含まれます。cbo.Itemsに掘削 enter image description here

:すべての後 enter image description here

グリッドの外観(コンボにデータがない)を enter image description here

+0

a)Nothingは何ですか(マウスを動かす)?これは 'cbo'または' dt'でなければなりません。 DGVデザインにcboがありますか?あなたは "Wariacja"に名前のプロパティを設定しましたか?いずれかが 'cbo'をnullにするでしょう。 b)** 'Rows.Add'でcboを渡してはいけません。もしあれば、そのプロパティの値を渡してください。私の中で、最初のものが4番目のデータ要素項目を持っていることに注意してください。 – Plutonix

+0

@JimmyJimmこれは 'Dim cbo As DataGridViewComboBoxColumn = Me.Wariacja'をコンパイルしますか? (またはComboBoxColumnの名前が何であれ) – Slai

+0

これを開くには2回のクリックが必要です。最初のクリックは選択されている行/セルです - 行ヘッダーの矢印が表示されますジャンプ - 2番目がcboを開きます – Plutonix

答えて

1

場合自分で列を作成しただけで、cboを追加するだけですデータ。

Dim sql = "SELECT Id, Name FROM Foo" 
Dim dt = ... get the dt from db 

' cast column 3/Foo to CBO column to access CBO related props 
Dim cbo = CType(dgv2.Columns("FooCol"), DataGridViewComboBoxColumn) 
cbo.DataSource = dt 
cbo.ValueMember = "Id" 
cbo.DisplayMember = "Name" 

しかし、これはDataSource DGVのためList様またはDataTableなしでうまく動作しません - IDを保存する場所がありません。小規模なクラスとListを簡単に作成するのは簡単でしょうが、それでも過度な作業かもしれません。

代わり、手動DGVを移入するのでwell.Thisコードが列全体ためのリストを設定し、それは一度だけ実行する必要があるとして、ちょうどItemsコレクションを移入:

Dim cbo = CType(dgv2.Columns("FooCol"), DataGridViewComboBoxColumn) 
' get all the names to be used 
cbo.Items.AddRange(dt.AsEnumerable(). 
        Select(Function(s) s.Field(Of String)("Name")). 
        ToArray()) 

行を追加するには、単に新しい行を追加するだけです。 CBO列の場合、あなたは現在の選択を示す文字列を渡す、または新しい行のために多分それをスキップ:アイテムのコレクションを移入することは一度限りのものであることを

' add one or more rows - no Foo data yet 
dgv2.Rows.Add("Ziggy", "Orange", 1, "Cat") 
dgv2.Rows.Add("Zoey", "Blue", 3) 
dgv2.Rows.Add("Zalgo", "Green", 78) 

注意。ユーザーが選択した行を追加/削除することはできますが、cboは1回だけ設定する必要があります。

fooのデータがある場合は、DataTableの値の1つが供給されます。バインドされていない場合は、DataTableを保持する必要があるため、選択したテキストの値/ IDを検索できます。結果:

enter image description hereenter image description here


別の方法としては、クラスオブジェクトへのツリービューデータをコピーして、あなただけ一度に一つの項目を編集している場合PropertyGridを使用することです。これにより、TypeConverterは1つのものを表示し、データバインドコントロールとして別のものを保存することができます。

+0

のcboアイテムリストのコピーを追加します。メインポストagaiを参照してください。索引で使用されています。この行にはエラーが表示されます:dgvMaterials.Rows.Add(material、rodzajName、rodzajID、 "Farbe") :DataGridviewの形式で、次の例外がありました:System.FormatException。値は、DataGridviewcomBoboxcellは正しくない –

+0

うん、そうする必要があります。答えを慎重に読んでください:DGVはバインドされていないので、ValueMember/Idを格納する場所がないため、 'Items.AddRange'メソッドを使用する必要があります。明らかに1つのアイテムのリストにデータをラップする場合を除き、ユーザーはアイテムを選択し、IDを検索します。 DGVのセットアップ以外に、[これは文字通り私が動作させるために必要なすべてのコードです](http://pastebin.com/qQV5Ar9J)。後でデータテーブルを使用してIDを取得する – Plutonix

関連する問題