簡體   English   中英

數據綁定DataGridView中的ComboBox列

[英]ComboBox Column within databound DataGridView

我再次遇到另一個DataGidView問題

我正在創建一個應用程序,允許用戶為購買的產品創建票證

該表單由一個DataGidView組成,該視圖允許用戶記錄產品詳細信息以及價格和數量信息。

當前,DataGidView已綁定數據,並且在運行時使用數據適配器和命令構建器保存了數據

這些列是自動創建的,然后按如下所示設置諸如格式選項之類的屬性

Private Sub SetTicketList()

    Try
        Con.ConnectionString = CropTrackMod.strConn
        SQLAdaptor.SelectCommand = New SqlClient.SqlCommand("SELECT ID, StockRef, Weight, EstimatedPrice, DespatchedQuantity,EstimatedTransportPer,VATRate, EstimatedTransportTotal,EstimatedVAT, EstimatedLineTotal,TicketRef FROM TicketDetail where ticketref ='x'", Con)
        builder = New SqlClient.SqlCommandBuilder(SQLAdaptor)
        Con.Open()

        Dim myTable As DataTable = New DataTable
        SQLAdaptor.Fill(myTable)

        dgvTicketDetail.DataSource = myTable

        'ID Column
        dgvTicketDetail.Columns(0).Visible = False

        'StockRef
        dgvTicketDetail.Columns(1).HeaderText = "StockRef"
        dgvTicketDetail.Columns(1).CellType.

        'Weight
        dgvTicketDetail.Columns(2).HeaderText = "Weight"
        dgvTicketDetail.Columns(2).DefaultCellStyle.Format = "0"
        dgvTicketDetail.Columns(2).DefaultCellStyle.NullValue = "0"

        'Price Per Unit
        dgvTicketDetail.Columns(3).HeaderText = "Price"
        dgvTicketDetail.Columns(3).DefaultCellStyle.Format = "0.00"
        dgvTicketDetail.Columns(3).DefaultCellStyle.NullValue = "0.00"

        'Quantity
        dgvTicketDetail.Columns(4).HeaderText = "Quantity"
        dgvTicketDetail.Columns(4).DefaultCellStyle.Format = "0"
        dgvTicketDetail.Columns(4).DefaultCellStyle.NullValue = "0"

        'Transport Cost Per Unit
        dgvTicketDetail.Columns(5).HeaderText = "TransportCostPer"
        dgvTicketDetail.Columns(5).DefaultCellStyle.Format = "0.00"
        dgvTicketDetail.Columns(5).DefaultCellStyle.NullValue = "0.00"

        'VAT Rate
        dgvTicketDetail.Columns(6).HeaderText = "VAT Rate"
        dgvTicketDetail.Columns(6).DefaultCellStyle.Format = "0.00"
        dgvTicketDetail.Columns(6).DefaultCellStyle.NullValue = "0.00"
        dgvTicketDetail.Columns(6).ReadOnly = True

        'Transport Total
        dgvTicketDetail.Columns(7).HeaderText = "Transport Total"
        dgvTicketDetail.Columns(7).DefaultCellStyle.Format = "0.00"
        dgvTicketDetail.Columns(7).DefaultCellStyle.NullValue = "0.00"
        dgvTicketDetail.Columns(7).ReadOnly = True

        'VAT Total
        dgvTicketDetail.Columns(8).HeaderText = "VAT Total"
        dgvTicketDetail.Columns(8).DefaultCellStyle.Format = "0.00"
        dgvTicketDetail.Columns(8).DefaultCellStyle.NullValue = "0.00"
        dgvTicketDetail.Columns(8).ReadOnly = True

        'line Total
        dgvTicketDetail.Columns(9).HeaderText = "Total"
        dgvTicketDetail.Columns(9).DefaultCellStyle.Format = "0.00"
        dgvTicketDetail.Columns(9).DefaultCellStyle.NullValue = "0.00"
        dgvTicketDetail.Columns(9).ReadOnly = True


        'line Total
        dgvTicketDetail.Columns(10).HeaderText = "TicketRef"
        dgvTicketDetail.Columns(10).Visible = False
    Finally
        If Con.State = ConnectionState.Open Then
            Con.Close()
        End If
    End Try

End Sub

其中一列是用於股票參考的,此刻我可以自由鍵入此字段,但最終我希望這是一個組合框列,用戶可以在其中從另一個表的股票參考列表中進行選擇。

我已經研究了此問題,並找到了許多與在運行時創建列相關的示例,但是我不認為這種方法在這種情況下會像我手動創建列那樣工作,因此不會綁定到我想要的數據源上將信息保存到。

手動列創建

Dim dgvc As DataGridViewComboBoxCell
dgvc = DataGridView1.Rows(0).Cells(2)

if DataGridView1.Rows(0).Cells(1).Value = "Jack" then
    dgvc.Items.Add("Fe")
    dgvc.Items.Add("Fi")
elseif DataGridView1.Rows(0).Cells(3).Value = "Giant" then
    dgvc.Items.Add("Fo")
    dgvc.Items.Add("Fum")
End if

我最初計划手動將項目添加到組合框中,但是我看到了能夠對項目進行數據綁定的示例。 我想這是另一回事了

任何幫助總是很感激。

在此先感謝大家

受此啟發,我做了一些我覺得更靈活的類似事情,因此我想與大家分享。 主要優點是您無需關閉列的自動生成。 這是在我已經將datagridviews(dgvPickList)數據源設置為數據表,並且還將我的位置列表加載到數據表dtLocations中之后。 它替換了第二列,該列綁定到字段“ Location”

Dim comboBoxColumn As DataGridViewComboBoxColumn = New DataGridViewComboBoxColumn()
comboBoxColumn.HeaderText = "Location"
comboBoxColumn.DataPropertyName = "Location"
comboBoxColumn.DataSource = dtLocations
comboBoxColumn.ValueMember = dtLocations.Columns(0).ColumnName
comboBoxColumn.DisplayMember = dtLocations.Columns(1).ColumnName

dgvPickList.Columns.RemoveAt(1)
dgvPickList.Columns.Insert(1, comboBoxColumn)

希望這是有用的。

我通過使用datagridview禁用自動生成列並手動添加每列來解決了該問題。 這使我可以創建一個組合框列,並為此添加選擇。 對此的進一步改進是將數據源添加到組合框列,以便它自動從庫存表中加載項目

代碼如下

Private Sub SetTicketListTemp()

    Try
        Con.ConnectionString = CropTrackMod.strConn
        SQLAdaptor.SelectCommand = New SqlClient.SqlCommand("SELECT ID, StockRef, Weight, EstimatedPrice, DespatchedQuantity,EstimatedTransportPer,VATRate, EstimatedTransportTotal,EstimatedVAT, EstimatedLineTotal,TicketRef FROM TicketDetail where ticketref ='x'", Con)
        builder = New SqlClient.SqlCommandBuilder(SQLAdaptor)
        Con.Open()

        Dim myTable As DataTable = New DataTable
        SQLAdaptor.Fill(myTable)

        dgvTicketDetail.AutoGenerateColumns = False
        dgvTicketDetail.DataSource = myTable

        'ID Column
        Dim col1 As New DataGridViewTextBoxColumn
        col1.DataPropertyName = "ID"
        col1.HeaderText = "ID"
        col1.Name = "ID"
        col1.Visible = False
        dgvTicketDetail.Columns.Add(col1)


        'StockRef
        Dim col2 As New DataGridViewComboBoxColumn
        col2.DataPropertyName = "StockRef"
        col2.HeaderText = "StockRef"
        col2.Name = "StockRef"

        col2.Items.Add("StockItem1")
        col2.Items.Add("StockItem2")

        dgvTicketDetail.Columns.Add(col2)


        'Weight
        Dim col3 As New DataGridViewTextBoxColumn
        col3.DataPropertyName = "Weight"
        col3.HeaderText = "Weight"
        col3.Name = "Weight"
        col3.DefaultCellStyle.Format = "0"
        col3.DefaultCellStyle.NullValue = "0"
        dgvTicketDetail.Columns.Add(col3)

        'Price Per Unit
        Dim col4 As New DataGridViewTextBoxColumn
        col4.DataPropertyName = "EstimatedPrice"
        col4.HeaderText = "Price"
        col4.Name = "Price"
        col4.DefaultCellStyle.Format = "0.00"
        col4.DefaultCellStyle.NullValue = "0.00"
        dgvTicketDetail.Columns.Add(col4)

        'Quantity
        Dim col5 As New DataGridViewTextBoxColumn
        col5.DataPropertyName = "DespatchedQuantity"
        col5.HeaderText = "Quantity"
        col5.Name = "Quantity"
        col5.DefaultCellStyle.Format = "0"
        col5.DefaultCellStyle.NullValue = "0"
        dgvTicketDetail.Columns.Add(col5)

        'Transport Cost Per Unit
        Dim col6 As New DataGridViewTextBoxColumn
        col6.DataPropertyName = "EstimatedTransportPer"
        col6.HeaderText = "TransportCostPer"
        col6.Name = "TransportCostPer"
        col6.DefaultCellStyle.Format = "0.00"
        col6.DefaultCellStyle.NullValue = "0.00"
        dgvTicketDetail.Columns.Add(col6)


        'VAT Rate
        Dim col7 As New DataGridViewTextBoxColumn
        col7.DataPropertyName = "VATRate"
        col7.HeaderText = "VAT Rate"
        col7.Name = "VATRate"
        col7.DefaultCellStyle.Format = "0.00"
        col7.DefaultCellStyle.NullValue = "0.00"
        col7.ReadOnly = True
        dgvTicketDetail.Columns.Add(col7)

        'Transport Total
        Dim col8 As New DataGridViewTextBoxColumn
        col8.DataPropertyName = "EstimatedTransportTotal"
        col8.HeaderText = "Transport Total"
        col8.Name = "TransportTotal"
        col8.DefaultCellStyle.Format = "0.00"
        col8.DefaultCellStyle.NullValue = "0.00"
        col8.ReadOnly = True
        dgvTicketDetail.Columns.Add(col8)

        'VAT Total
        Dim col9 As New DataGridViewTextBoxColumn
        col9.DataPropertyName = "EstimatedVAT"
        col9.HeaderText = "VAT Total"
        col9.Name = "VATotal"
        col9.DefaultCellStyle.Format = "0.00"
        col9.DefaultCellStyle.NullValue = "0.00"
        col9.ReadOnly = True
        dgvTicketDetail.Columns.Add(col9)

        'line Total
        Dim col10 As New DataGridViewTextBoxColumn
        col10.DataPropertyName = "EstimatedLineTotal"
        col10.HeaderText = "Total"
        col10.Name = "Total"
        col10.DefaultCellStyle.Format = "0.00"
        col10.DefaultCellStyle.NullValue = "0.00"
        col10.ReadOnly = True
        dgvTicketDetail.Columns.Add(col10)



        'TicketRef
        Dim col11 As New DataGridViewTextBoxColumn
        col11.DataPropertyName = "TicketRef"
        col11.HeaderText = "TicketRef"
        col11.Name = "TicketRef"
        col11.Visible = False
        dgvTicketDetail.Columns.Add(col11)

    Finally
        If Con.State = ConnectionState.Open Then
            Con.Close()
        End If
    End Try

End Sub

希望這可以幫助其他陷入困境的人

祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM