2014-01-13 68 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 
相关问题