2014-01-13 70 views
2

我從兩個表中加載數據:機構和國家。學院有3列:instId,name,countryId。而國家有2列:countryId,countryId是國家表中的一個外鍵的名稱。我將這兩個表填入數據集中。我有datagridview並將其數據源設置爲我的數據集中的表。我也創建datagridviewcomboboxcolumn並綁定它的國家表。看看下面的代碼:VB.Net綁定datagridview comboboxcolumn到datagridviewTextboxColumn

Public Class frmDGV 

    Dim sqlConn As SqlConnection 
    Dim dsOptions As DataSet 
    Dim daInstitute As SqlDataAdapter 
    Dim daAdapter As SqlDataAdapter 
    Dim bsCountry As BindingSource 

    Private Sub frmTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Try 
      dsOptions = New DataSet 
      loadOptions() 

      dgvInstitute.DataSource = dsOptions.Tables("institute") 
      bsCountry = New BindingSource(dsOptions, "country") 

      Dim col As New DataGridViewComboBoxColumn 
      col.DataPropertyName = "countryName" 
      col.HeaderText = "Country" 
      col.Name = "cName" 

      col.DataSource = bsCountry 
      col.DisplayMember = "countryName" 
      col.ValueMember = "countryId" 

      dgvInstitute.Columns.Add(col) 
      dgvInstitute.Columns(0).Width = 60 
      dgvInstitute.Columns(1).Width = 200 
      dgvInstitute.Columns(2).Width = 60 
      dgvInstitute.Columns(3).Width = 120 

     Catch ex As Exception 
      MsgBox(Err.Description) 
     End Try 
    End Sub 

    Sub loadOptions() 
     Dim sql As String 

     Try 
      sqlConn = New SqlConnection(connString) 
      sqlConn.Open() 

      sql = "select instId, name, countryId from institute" 
      daInstitute = New SqlDataAdapter(sql, sqlConn) 
      daInstitute.Fill(dsOptions, "institute") 
      '---------------------------------------------------------------------- 

      sql = "select countryId, countryName from country" 
      daAdapter = New SqlDataAdapter(sql, sqlConn) 
      daAdapter.Fill(dsOptions, "country") 
      '---------------------------------------------------------------------- 

      sqlConn.Close() 
     Catch ex As Exception 
      sqlConn.Close() 
      MsgBox(Err.Description) 
     End Try 
    End Sub 
End Class 

我怎樣才能在使用綁定技術,不使用循環DataGridView的基礎上,countryId組合框顯示正確的國名? 看到下面的圖片:enter image description here

回答

2

變化DataPropertyName爲comboboxcolumn在你的datagridview的唯一方法:

... 
col.DataPropertyName = "countryId" 
... 

.DataPropertyName - 從datagridview.DataSource列名,其你想在當前欄目中顯示。

+0

Fabio先生,請您根據我的代碼發送完整的代碼嗎?謝謝 –

+0

@ HilalAl-Rajhi,我的意見是,你的代碼必須工作,只改變一行,如我的答案... – Fabio

+0

謝謝法比奧先生,你是對的。我只是修改了代碼並粘貼了一行:'col.DataPropertyName =「countryId」' –

0

說實話我不知道如果你可以因爲你綁定這個方式。

國家列是否需要在ComboBox中?您可以在第一個查詢中包含國家/地區名稱。

我真的可以看到這樣做會是這樣的

for(int i = 0; i<dgvInstitute.Rows.Count; i++) 
{ 
    dgvInstitute.Rows[rowIndexYouWant].Cells["cName"].Value = dgvInstitute.Rows[rowIndexYouWant].Cells["countryId"].Value; 

} 
+0

是的,國家必須是一個組合框,目的是使用戶能夠更改該機構所在的國家。我可以使用文本框並綁定一個SQL查詢中的兩個表,但我想學習新技術。但你的建議工作正常,但不是我的需要。 –

-1
Imports System.Data.SqlClient 
Imports System.Data 

Public Class DataGridViewBind 

Private Sub DataGridViewBind_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 



    'Preparing The Column 
    Dim col0 As New DataGridViewTextBoxColumn 
    col0.HeaderText = "InstID" 
    col0.Name = "InstID" 
    col0.Width = 100 
    col0.MaxInputLength = 100 
    dgv1.Columns.Add(col0) 

    Dim col1 As New DataGridViewTextBoxColumn 
    col1.HeaderText = "Name" 
    col1.Name = "Name" 
    col1.Width = 100 
    col1.MaxInputLength = 100 
    dgv1.Columns.Add(col1) 

    Dim col2 As New DataGridViewTextBoxColumn 
    col2.HeaderText = "CountryID" 
    col2.Name = "CountryID" 
    col2.Width = 100 
    col2.MaxInputLength = 100 
    dgv1.Columns.Add(col2) 

    Dim Col3 As New DataGridViewComboBoxColumn 
    Col3.HeaderText = "CountryName" 
    Col3.Name = "CountryName" 
    Col3.Width = 100 
    ProcessCountryComboBox(Col3) 'Bind Country Name to the ComboBox 
    dgv1.Columns.Add(Col3) 


    'Prepare the DataGridView 

    ListDataGridView(dgv1) 


End Sub 

Public Sub ProcessCountryComboBox(ByVal colX As DataGridViewComboBoxColumn) 
    Dim StrConn As String = My.Settings.ImportLinkCS 
    Dim CN = New SqlConnection(StrConn) 

    LoadGridComboByQuery(colX, "Select Name from Country order by Name") 

End Sub 


Public Sub LoadGridComboByQuery(ByVal cbo As DataGridViewComboBoxColumn, ByVal SQLString As String) 
    Dim i As Integer 
    Dim cmdUser As New SqlCommand 
    Dim daUser As New SqlDataAdapter 
    Dim dsUser As New DataSet 
    Dim dtUser As New DataTable 
    Dim conn As New SqlConnection(My.Settings.ImportLinkCS) 
    Try 
     cbo.Items.Clear() 

     cmdUser = conn.CreateCommand 
     cmdUser.CommandText = SQLString 
     daUser.SelectCommand = cmdUser 
     daUser.Fill(dsUser, "Sqltable") 
     dtUser = dsUser.Tables("Sqltable") 
     For i = 0 To dtUser.Rows.Count - 1 
      cbo.Items.Add(dtUser.Rows(i).Item(0)) 
     Next 

     cbo.Items.Add("") 

    Catch ex As Exception 
     MsgBox("Error: " & ex.Source & ": " & ex.Message, MsgBoxStyle.OkOnly, "Error conection!!") 
    End Try 
    conn.Close() 
    conn = Nothing 
End Sub 

Private Sub ListDataGridView(ByVal dgv As DataGridView) 



    dgv.DataSource = Nothing 
    Try 
     Dim dbBindSource As New BindingSource 
     Dim strCon As String = My.Settings.ImportLinkCS 
     Dim strSQL As String = "Select I.InstID, I.Name, I.Country, C.Name as CountryName " + _ 
           "from Institute I left Join Country C on C.CountryID = I.Country" 

     Dim dataAdapter As SqlDataAdapter = New SqlDataAdapter(strSQL, strCon) 
     Dim commandBuilder As SqlCommandBuilder = New SqlCommandBuilder(dataAdapter) 

     'Populate a new data table and bind it to the BindingSource. 
     Dim table As DataTable = New DataTable() 
     table.Locale = System.Globalization.CultureInfo.InvariantCulture 
     dataAdapter.Fill(table) 

     dgv.AutoGenerateColumns = False 


     dgv.Columns(0).DataPropertyName = "InstID" 
     dgv.Columns(1).DataPropertyName = "Name" 
     dgv.Columns(2).DataPropertyName = "Country" 
     dgv.Columns(3).DataPropertyName = "CountryName" 


     dbBindSource.DataSource = table 
     //Resize the DataGridView columns to fit the newly loaded content. 
     //dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader) 

     dgv.DataSource = dbBindSource 


    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "error") 
    End Try 


End Sub 


End Class 
相關問題