我有一个数据网格,我正在使用LINQ填充,然后添加一些自定义列并以编程方式填充它们 - 如果用户单击列标题进行重新排序,则添加列中的所有数据都将消失。我显然在这里遗漏了一些非常基本的东西,但似乎无法看到森林中的树木。
我还有其他一些关于我如何做事的问题:
这是我第一次使用像这样的数据网格,所以任何指针都会很好。
用于提取数据的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文件用于导出 - 显然重要的是最正确的数据保留在每一行中!
提前感谢您的建议。
答案 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
以上代码现在有效......
感谢。