是我用法不对,还是C1ComboBox有bug!
本帖最后由 foxtable 于 2016-5-19 16:32 编辑我发现C1Combobox如果指定了ItemsImageList属性,且绑定到某列的时候,就没办法通过下拉列表选择值。
测试过程:
1、新建一个窗口,窗口中有两个控件,一个C1Flexgrid,一个C1ComboBox
2、好友一个ImageList组件,已经添加了看六个16*16图片,图片的Key分别为:a、b、c、d、e、f
3、窗口的代码如下:
Public Class Form1
Dim dt As Data.DataTable
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dt = New Data.DataTable
For i As Integer = 1 To 10
dt.Columns.Add("Col" & i, GetType(String))
Next
For i As Integer = 1 To 5
dt.Rows.Add(dt.NewRow)
Next
Me.C1FlexGrid1.DataSource = dt.DefaultView
Me.C1ComboBox1.DataSource = dt.DefaultView
Me.C1ComboBox1.DataField = "Col1"
Dim values() As String = {"a", "b", "c", "d", "e", "f"}
Me.C1ComboBox1.Items.AddRange(values)
Me.C1ComboBox1.ItemsImageList = Me.ImageList1
End Sub
End Class
4、运行窗口,当我们单击C1ComboBox的下拉按钮,选择a、b、c、d、e、f中的任何一个值,所选择的值没办法显示在C1ComboBox中,但是手工输入则可以。
版本: 20161.147
up:itwn: 本帖最后由 Alice 于 2016-5-20 09:01 编辑
代码的问题,根据你的代码。
首先,你的DataTable里是没有数据的。
其次,C1ComboBox的绑定DataTable应该这样设置:
this.c1ComboBox2.ItemsDataSource = dt.DefaultView;
this.c1ComboBox2.ItemsDisplayMember = "Col1";
this.c1ComboBox2.ItemsValueMember = "Col1";
其实,C1ComboBox数据绑定的数据应该从DataTable中添加,而不是通过非绑定模式的Items.Add直接添加。
你所指定的"a","b","c"应该是你DataTable中的Col1中的值。
所以代码应该是这样的:
DataTable dt = new DataTable();
for(inti =1;i<10;i++)
{
dt.Columns.Add("Col" + i.ToString());
}
string[] values = new string[] { "a", "b", "c", "d", "e", "f" };
for(int i= 0;i< values.Length;i++)
{
dt.Rows.Add(new object[]{values});
}
this.c1FlexGrid1.DataSource = dt.DefaultView;
this.c1ComboBox2.ItemsDataSource = dt.DefaultView;
this.c1ComboBox2.ItemsDisplayMember = "Col1";
this.c1ComboBox2.ItemsValueMember = "Col1";
c1ComboBox2.ItemsImageList = imageList2; 本帖最后由 foxtable 于 2016-5-20 08:08 编辑
我担心的问题还是出现了,版主又误解我的意思了,我说的绑定,不是说C1Combox的Items来自某个表的某列,而是将c1的输入值(Value)绑定到某列,我说的绑定是这两行代码:
Me.C1ComboBox1.DataSource = dt.DefaultView
Me.C1ComboBox1.DataField = "Col1"
这样我直接在C1Combox1输入内容就可以写入到绑定的列中。
然后我给C1ComboBox设置候选值:
Dim values() As String = {"a", "b", "c", "d", "e", "f"}
Me.C1ComboBox1.Items.AddRange(values)
这样用户可以通过下来列表选择值,不用手工输入。
到这一步正常。
我希望更进一步,加上图片,如是事先在ImagesList中添加好a、b、c、d、e、f对应的图片,然后添加一行代码:
Me.C1ComboBox1.ItemsImageList = Me.ImageList1
现在C1Combobox本身及其下拉列表都可以显示图片,但是却不能通过下拉列表选择值。
我把例子发上来,版主可以测试一下,c1combox可以可以正常显示下拉列表和图片,但是无法通过下拉列表选择值。
上面的例子是2.0,应该少人用,我用4.0重新做了一个例子:
本帖最后由 Alice 于 2016-5-20 11:19 编辑
foxtable 发表于 2016-5-20 08:22
我把例子发上来,版主可以测试一下,c1combox可以可以正常显示下拉列表和图片,但是无法通过下拉列表选择值 ...
在之前解释过了ItemsDataSource的绑定,是将Items和数据源绑定,下拉框里的数据来自数据源。
使用DataSource和ItemsImageList就是目前的设计。
你用了DataSource属性绑定,就是将C1ComboBox的输入框的文字和数据源绑定。
在这里,你将输入框绑定到了DataTable的Col1列的SelectedCell上。
按照目前的设计,使用Image后,C1ComboBox的输入框的内容只能通过输入或是DataTable的选择的更改,进行更新。下拉框的选择无法更新到数据源里,所以输入框一直为空
我会帮你给产品组提一个需求,如果有反馈会通知您。
如果不使用Image,可以正常的选择值和输入值。
如果使用Image,则不能正常的选择值,只能输入值。
Image的出现,只不过让选项变得更美观一点而已,和选择值由什么关系呢?
显然这不是一个正常的设计,是一个明显的缺陷或bug。
简简单单的几个候选值,不能直接赋值,非要用一个DataTable来组织,何必如此繁琐呢?
如果一个程序有几十个这样的选择框,就要准备几十个这样的DataTable?
个人觉得: 这不是一个需求,这是一个大大的bug。
本帖最后由 foxtable 于 2016-5-20 11:20 编辑
我之前是用下面的方法绕开这个问题,也许有参考价值:
Dim dt As Data.DataTable
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dt = New Data.DataTable
For i As Integer = 1 To 10
dt.Columns.Add("Col" & i, GetType(String))
Next
For i As Integer = 1 To 5
dt.Rows.Add(dt.NewRow)
Next
Me.C1FlexGrid1.DataSource = dt.DefaultView
Me.C1ComboBox1.DataSource = dt.DefaultView
Me.C1ComboBox1.DataField = "Col1"
Dim values() As String = {"a", "b", "c", "d", "e", "f"}
Me.C1ComboBox1.Items.AddRange(values)
Me.C1ComboBox1.ItemsImageList = Me.ImageList1
End Sub
Private Sub C1ComboBox1_SelectedItemChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles C1ComboBox1.SelectedItemChanged
Me.C1ComboBox1.Value = Me.C1ComboBox1.SelectedItem
If Me.C1ComboBox1.DataBindings.Count > 0 AndAlso Me.C1ComboBox1.DataBindings(0).BindingManagerBase.Count > 0 Then
Dim cur As Object = Me.C1ComboBox1.DataBindings(0).BindingManagerBase.Current
If TypeOf cur Is Data.DataRowView Then
Dim dr As Data.DataRow = CType(cur, Data.DataRowView).Row
Dim cn As String = Me.C1ComboBox1.DataBindings(0).BindingMemberInfo.BindingField
If dr(cn).ToString <> Me.C1ComboBox1.SelectedItem.ToString Then
Me.C1ComboBox1.Value = Me.C1ComboBox1.SelectedItem
Me.C1ComboBox1.DataBindings(0).WriteValue()
CType(cur, Data.DataRowView).Row.EndEdit()
End If
End If
End If
End Sub foxtable 发表于 2016-5-20 10:45
如果不使用Image,可以正常的选择值和输入值。
如果使用Image,则不能正常的选择值,只能输入值。
Image ...
不太理解用DataTable来组织这句话的意思。
如果不进行数据绑定,直接打开下拉框选择都是没有问题的。
数据绑定的时候,下拉框里有图片,DataTable不接受图片的存储,没有存进去,所以就返回了空,需要处理下。
问题已经提交到产品组,谢谢您反馈的方法。
页:
[1]
2