我决定遍历Data.DataTable
并修剪那里的值。
利用SirDemon's帖子,我稍微更新了代码:
Sub test(ByVal path As String)
Dim oData As GSDataObject = GetDataObj(path)
EmptyComboBoxes()
Dim oDT As New Data.DataTable
Try
Dim t = From r In oData.GetTable(String.Format("SELECT * FROM {0}gsobj\paths ORDER BY keyid", AddBS(path))) Select r
If t.Count > 0 Then
oDT = t.CopyToDataTable
For Each dr As Data.DataRow In oDT.Rows
dr.Item("key_code") = dr.Item("key_code").ToString.Trim
dr.Item("descript") = dr.Item("descript").ToString.Trim
Next
dataPathComboBox.DataSource = oDT
dataPathComboBox.DisplayMember = "descript"
dataPathComboBox.ValueMember = "key_code"
dataPathComboBox.SelectedIndex = 0
dataPathComboBox.Enabled = True
End If
Catch ex As Exception
End Try
End Sub
这几乎就像我需要的那样,数据最初来自foxpro表,因此它返回的字符串是<value>
加上(<Field>.maxlength-<value>.length
)尾随空白字符。例如,长度为12个字符的字段的值为bob。当我查询数据库时,我得到“bob_________
”,其中_是一个空格。
我尝试了几种不同的东西来摆脱空白,例如:
dataPathComboBox.DisplayMember.Trim()
dataPathComboBox.DisplayMember = "descript".Trim
。
但还没有任何效果。除了遍历Data.DataTable
或创建自定义CopyToDataTable
方法之外,我有什么办法可以修剪这些值吗?也许它可以与LINQ查询一起完成?
这是我到目前为止的代码,查询数据库并获取信息没有问题,但我无法弄清楚如何在ComboBox列表中显示正确的文本。我总是得到System.Data.DataRow
:
Try
Dim t = From r In oData.GetTable("SELECT * FROM ../gsobj/paths ORDER BY keyid") _
Select r
dataPathComboBox.DataSource = t.ToList
dataPathComboBox.SelectedIndex = 0
'dataPathComboBox.DisplayMember = t.ToList.First.Item("descript")
dataPathComboBox.Enabled = True
Catch ex As Exception
Stop
End Try
我知道在DisplayMember行上.First.Item()
部分是错误的,我只想显示我想要指定为DisplayMember的行。
答案 0 :(得分:1)
我很确定你的代码试图将整个DataRow设置为一个属性,该属性只是Field(在强类型类中)或Column(在DataTable中)的名称。
dataPathComboBox.DisplayMember = "descript"
如果DataTable包含该名称的检索列,则应该有效。
此外,我建议您在完成DataBinding之后设置SelectedIndex,并且您知道实际上有项目,否则SelectedIndex = 0
可能会抛出异常。
编辑:修剪绑定列的名称将修剪它,而不是实际的绑定值字符串。您必须在绑定后检查所有项目并执行以下操作:
dataPathComboBox.Item[i].Text = dataPathComboBox.Item[i].Text.Trim()
对于每个项目。不确定您正在使用的ComboBox控件,因此项集合名称可能是其他名称。
如果ComboBox控件暴露了某种类型的onItemDataBound事件,则另一个解决方案就是绑定每个项目。
还有很多其他方法可以做到这一点,具体取决于控件本身提供的内容以及您选择做什么。
答案 1 :(得分:0)
DisplayMember用于指示包含要显示的值的属性的名称。
在你的情况下,我不确定语法是什么,因为你好像在使用DataSet,但那应该是
... DisplayMember="Item['descript']" ...
在Xaml中,除非您需要在运行时切换它,在这种情况下,您可以使用
在代码中执行此操作dataPathComboBox.DisplayMember = "Item['descript']"
同样,不是100%肯定语法。如果你使用的是强类型的DataSet,那就更容易了,因为你的行上应该有一个“descript”属性,但是给定的是你的错误表示“System.DataRow”而不是自定义类型,我想你不是。
答案 2 :(得分:0)
因为我无法找出您正在使用的数据源的基础类型,我建议您将注释字符串更改为
dataPathComboBox.DisplayMember = t.ElementType.GetProperties.GetValue(0).Name
并尝试在实践中确定正确的索引(最初为零)。