数据网格擦除条目和一般数据网格访问的混淆

时间:2009-05-09 11:49:16

标签: vb.net datagridview

我有一个数据网格,我正在使用LINQ填充,然后添加一些自定义列并以编程方式填充它们 - 如果用户单击列标题进行重新排序,则添加列中的所有数据都将消失。我显然在这里遗漏了一些非常基本的东西,但似乎无法看到森林中的树木。

我还有其他一些关于我如何做事的问题:

  1. 在我的代码中我按名称访问datagrid自定义单元格,但来自LINQ的单元格我必须使用单元格引用号(即:(1,2)而不是(total,2)(我意识到name被替换为int) - 我可以命名列吗?如果最终用户重新订购它们怎么样?
  2. 这是我第一次使用像这样的数据网格,所以任何指针都会很好。

    用于提取数据的LINQ代码

      Dim query = From m In db.details _
                   Where m.InboundDate >= CType(MonthCalendar1.SelectionStart, DateTime) _
                   And m.InboundDate <= CType(MonthCalendar1.SelectionEnd, DateTime).AddHours(23).AddMinutes(59) _
                   And m.ClientNo = 1 _
                   Join md In db.Manifests On md.ManifestID Equals m.MainID _
                   Select m.Zone, m.MainID, m.InboundDate, m.Zip, md.LadingPkgQty, m.Weight
    

    填写数据和添加列的代码

    billingDatagrid.DataSource = query
    
    billingDatagrid.Columns.Add("Package Rate", "Package Rate")
    billingDatagrid.Columns.Add("LTL", "LTL Rate")
    billingDatagrid.Columns.Add("Freight", "Freight")
    billingDatagrid.Columns.Add("Fuel Surcharge", "Fuel Surcharge")
    billingDatagrid.Columns.Add("Linehaul", "Linehaul")
    billingDatagrid.Columns.Add("Billed Amount", "Billed")
    

    我如何访问datagrid列的代码示例:

    Select Case currentZone
        Case 1
            packageRate = Val(billingDatagrid(4, currentrow).Value) * zone1PkgRate
            billingDatagrid("Package Rate", currentrow).Value = packageRate
    
            If Val(billingDatagrid(5, currentrow).Value) > 500 Then
                LTLCharge = zone1_ltlBase + (Val(billingDatagrid(5, currentrow).Value) - 500) * zone1_ltlOver
            Else
                LTLCharge = zone1_ltlBase
            End If
    
            billingDatagrid("LTL", currentrow).Value = LTLCharge
    

    在所有这些结束时,我将不得不创建一个.csv文件用于导出 - 显然重要的是最正确的数据保留在每一行中!

    提前感谢您的建议。

2 个答案:

答案 0 :(得分:0)

您可以在网格中创建一个包含所需列的类,并在linq查询select语句中为每行创建一个新的类实例。

示例:

Public Class GridData
    Public Zone as (type here)
    ...all your other columns from the query
    Public PackageRate as (type here)
    ...all your other columns you add programatically
End Class

然后在查询中你可以这样做:

Select New GridData with {.Zone=m.Zone, .MainID=m.MainID, .InboundDate=m.InboundDate, .Zip=m.Zip, .LadingPkgQty=md.LadingPkgQty, .Weight=m.Weight, .PackageRate=Nothing, etc }

通过这种方式,您只需将查询分配给数据源,就像您正在进行的那样,并且所有列都应该显示出来并且仍然存在。希望能帮助到你。我认为这可以解决你的问题,因为列名也应该全部设置,但我没有测试那部分。

编辑: 即使在将PackageRate分配给网格数据源之前,也可以在循环中为其分配值。

For each row in query
   'you can read and write any of the properties of the GridData Class as row.Client, etc here
Next

然后将其分配给datagrid

答案 1 :(得分:0)

好的 - 这是最终的答案 - 代码工作和数据保持在应有的位置 -

感谢您的帮助!

我的班级:

Public Class GridData

Private _clientno
Private _manifest
Private _packagerate

Public Property PackageRate() As Double
    Get
        Return _packagerate
    End Get
    Set(ByVal value As Double)
        _packagerate = value
    End Set
End Property
Public Property manifest() As String
    Get
        Return _manifest
    End Get
    Set(ByVal value As String)
        _manifest = value
    End Set
End Property
Public Property client() As Int16
    Get
        Return _clientno
    End Get
    Set(ByVal value As Int16)
        _clientno = value
    End Set
End Property

结束班

linq:

     Dim query = From m In db.details _
            Where m.InboundDate >= CType(MonthCalendar1.SelectionStart, DateTime) _
            And m.InboundDate <= CType(MonthCalendar1.SelectionEnd, DateTime).AddHours(23).AddMinutes(59) _
            And m.ClientNo = 1 _
              Join md In db.Manifests On md.ManifestID Equals m.MainID _
            Select New GridData With {.PackageRate = Nothing, .manifest = m.MainID, .client = m.ClientNo}

   'No No -- billingDatagrid.Columns.Add("PackageRate", "PackageRate")

和一小段代码用来自客户编号的值填写包装:

   billingDatagrid.DataSource = query
    Dim currentrow As Int16 = 0
    For Each r In billingDatagrid.Rows
        billingDatagrid("PackageRate", currentrow).Value = billingDatagrid("client", currentrow).Value
        currentrow += 1
    Next

以上代码现在有效......

感谢。