数据绑定DataGridView中的ComboBox列 [英] ComboBox Column within databound DataGridView

查看:141
本文介绍了数据绑定DataGridView中的ComboBox列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我再次回到另一个DataGidView问题



我正在创建一个应用程序,允许用户为购买的产品创建一张票



此表格包含一个DataGidView,允许用户记录产品详细信息以及价格和数量信息。



目前,DataGidView是数据绑定和数据在运行时使用数据适配器和命令构建器保存$ / b
$ b

这些列是自动创建的,然后我设置如下格式选项的属性:

  Private Sub SetTicketList()

尝试
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 SqlClie nt.SqlCommandBuilder(SQLAdaptor)
Con.Open()

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

dgvTicketDetail。 DataSource = myTable

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

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

'重量
dgvTicketDetail.Columns(2).HeaderText =重量
dgvTicketDetail.Columns(2).DefaultCellStyle.Format =0
dgvTicketDetail。列(2).DefaultCellStyle.NullValue =0

'每单位价格
dgvTicketDetail.Columns(3).HeaderText =Price
dgvTicketDetail.Columns(3) .DefaultCellStyle.Format =0.00
dgvTicketDetail.Columns(3).DefaultCellStyle.NullValue =0.00

'数量
dgvTicketDetail.Columns(4).HeaderText =数量
dgvTicketDetail.Columns(4).DefaultCellStyle.Format =0
dgvTicketDetail.Columns(4).DefaultCellStyle.NullValue =0

'单元
dgvTicketDetail.Columns(5).HeaderText =TransportCostPer
dgvTicketDetail.Columns(5).DefaultCellStyle.Format =0.00
dgvTicketDetail.Columns(5).DefaultCellStyle.NullValue = 0.00

'增值税率
dgvTicketDetail.Columns(6).HeaderText =增值税率
dgvTicketDetail.Columns(6).DefaultCellStyle.Format =0.00
dgvTicketDetail.Columns(6).DefaultCellStyle .NullValue =0.00
dgvTicketDetail.Columns(6).ReadOnly = True

'运输总额
dgvTicketDetail.Columns(7).HeaderText =运输总计
dgvTicketDetail.Columns(7).DefaultCellStyle.Format =0.00
dgvTicketDetail.Columns(7).DefaultCellStyle.NullValue =0.00
dgvTicketDetail.Columns(7).ReadOnly = True

'增值税总额
dgvTicketDetail.Columns(8).HeaderText =增值税总额
dgvTicketDetail.Columns(8).DefaultCellStyle.Format =0.00
dgvTicketDetail。列(8).DefaultCellStyle.NullValue =0.00
dgvTicketDetail.Columns(8).ReadOnly = True

'行总
dgvTicketDetail.Columns(9).HeaderText = 总计
dgvTicketDetail.Columns(9).DefaultCellStyle.Format =0.00
dgvTicketDetail.Columns(9).DefaultCellStyle.NullValue =0.00
dgvTicketDetail.Columns(9).ReadOnly = True


'行总计
dgvTicketDetail.Columns(10).HeaderText =TicketRef
dgvTicketDetail.Columns(10).Visible = False
最后
如果Con.State = ConnectionState.Open然后
Con.Close()
如果
结束尝试

End Sub

其中一列是为股票参考,在这一刻我可以自由输入这个字段,但最终我希望这是一个组合框列,用户可以从另一个表的股票参考列表中选择。



我已经研究了这个问题,并发现了一些与创建列有关的示例在运行时,我不觉得这将在这种情况下工作,就像我创建了列手册一样那么这不会限制我要保存信息的数据源。



手动创建列表

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

如果DataGridView1.Rows(0).Cells 1).Value =Jack然后
dgvc.Items.Add(Fe)
dgvc.Items.Add(Fi)
elseif DataGridView1.Rows(0).Cells (3).Value =巨人,然后
dgvc.Items.Add(Fo)
dgvc.Items.Add(Fum)
如果

我原来计划手动将项目添加到组合框中,但我看到了能够数据绑定项目的示例。我想这是另一个问题另一个时间



任何帮助总是感激。



/ p>

解决方案

我刚刚做了类似的事情,我觉得更灵活,这是灵感来源于我,尽管我会分享。
主要优点是您不需要关闭列的自动生成。



这是在我已经设置了datagridviews(dgvPickList )数据源到datatable,并且还加载了我的datatable dtLocations中的位置列表。



它将第二列替换为绑定到字段Location

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

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




Im back again with another DataGidView question

I am creating an application that allows the user to create a ticket for products purchased

This form consists of a DataGidViewwhich allows the user to record the product details along with price and quantity information.

Currently the DataGidView is data bound and data is saved using a data adaptor and command builder at runtime

The columns are created automatically and then i set properties such as formatting options as follows

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

One of the columns is for the stock reference, at the minute i am able to free type this field, but ultimately i would like this to be a combobox column where the user can select from a list of stock references from another table.

I have researched this issue and have found a number of examples which relate to creating a column at runtime but i dont feel that this would work in this situation as if i created the column manually then this would not be bound to the datasource which i want to save the information to.

MANUAL COLUMN CREATION

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

I originally planned on manually adding the items to the combobox but i have seen examples of being able to databind the items. I suppose this is another issue for another time

Any help is always appreciated.

Thanks in advance guys

解决方案

I have just done something similar that I feel is more flexible, which was inspired by this so I though I would share. The main advantage is that you don't need to switch off the auto generation of the columns.

This is after I have already set the datagridviews (dgvPickList) datasource to a datatable and also loaded my list of locations in the datatable dtLocations

It replaces the second column, which was bound to the field "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)

Hope that's useful.

这篇关于数据绑定DataGridView中的ComboBox列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆