foxtable 发表于 2016-5-19 14:58:44

是我用法不对,还是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


foxtable 发表于 2016-5-19 16:31:15

up:itwn:

Alice 发表于 2016-5-19 18:25:54

本帖最后由 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:04:40

本帖最后由 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本身及其下拉列表都可以显示图片,但是却不能通过下拉列表选择值。



foxtable 发表于 2016-5-20 08:22:22

我把例子发上来,版主可以测试一下,c1combox可以可以正常显示下拉列表和图片,但是无法通过下拉列表选择值。

foxtable 发表于 2016-5-20 09:01:48

上面的例子是2.0,应该少人用,我用4.0重新做了一个例子:

Alice 发表于 2016-5-20 10:29:02

本帖最后由 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的选择的更改,进行更新。下拉框的选择无法更新到数据源里,所以输入框一直为空

我会帮你给产品组提一个需求,如果有反馈会通知您。



foxtable 发表于 2016-5-20 10:45:02

如果不使用Image,可以正常的选择值和输入值。
如果使用Image,则不能正常的选择值,只能输入值。
Image的出现,只不过让选项变得更美观一点而已,和选择值由什么关系呢?

显然这不是一个正常的设计,是一个明显的缺陷或bug。

简简单单的几个候选值,不能直接赋值,非要用一个DataTable来组织,何必如此繁琐呢?
如果一个程序有几十个这样的选择框,就要准备几十个这样的DataTable?

个人觉得: 这不是一个需求,这是一个大大的bug。

foxtable 发表于 2016-5-20 11:12:58

本帖最后由 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

Alice 发表于 2016-5-20 11:26:36

foxtable 发表于 2016-5-20 10:45
如果不使用Image,可以正常的选择值和输入值。
如果使用Image,则不能正常的选择值,只能输入值。
Image ...

不太理解用DataTable来组织这句话的意思。

如果不进行数据绑定,直接打开下拉框选择都是没有问题的。
数据绑定的时候,下拉框里有图片,DataTable不接受图片的存储,没有存进去,所以就返回了空,需要处理下。

问题已经提交到产品组,谢谢您反馈的方法。
页: [1] 2
查看完整版本: 是我用法不对,还是C1ComboBox有bug!