找回密码
 立即注册

QQ登录

只需一步,快速开始

foxtable
金牌服务用户   /  发表于:2016-5-19 14:58  /   查看:7863  /  回复:14
本帖最后由 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


评分

参与人数 1金币 +300 收起 理由
Alice + 300

查看全部评分

14 个回复

倒序浏览
foxtable
金牌服务用户   /  发表于:2016-5-19 16:31:15
沙发
up
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-5-19 18:25:54
板凳
本帖最后由 Alice 于 2016-5-20 09:01 编辑

代码的问题,根据你的代码。
首先,你的DataTable里是没有数据的。
其次,C1ComboBox的绑定DataTable应该这样设置:
  1. this.c1ComboBox2.ItemsDataSource = dt.DefaultView;
  2.          this.c1ComboBox2.ItemsDisplayMember = "Col1";
  3.          this.c1ComboBox2.ItemsValueMember = "Col1";
复制代码

其实,C1ComboBox数据绑定的数据应该从DataTable中添加,而不是通过非绑定模式的Items.Add直接添加。

你所指定的"a","b","c"应该是你DataTable中的Col1中的值。

所以代码应该是这样的:
  1.   DataTable   dt = new DataTable();
  2.          for(int  i =1;i<10;i++)
  3.          {
  4.              dt.Columns.Add("Col" + i.ToString());
  5.          }

  6.          string[] values = new string[] { "a", "b", "c", "d", "e", "f" };
  7.          for(int i  = 0;i< values.Length;i++)
  8.          {
  9.                         dt.Rows.Add(new object[]{values[i]});
  10.          }

  11.          this.c1FlexGrid1.DataSource = dt.DefaultView;
  12.          this.c1ComboBox2.ItemsDataSource = dt.DefaultView;
  13.          this.c1ComboBox2.ItemsDisplayMember = "Col1";
  14.          this.c1ComboBox2.ItemsValueMember = "Col1";
  15.          c1ComboBox2.ItemsImageList = imageList2;
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
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
5#
我把例子发上来,版主可以测试一下,c1combox可以可以正常显示下拉列表和图片,但是无法通过下拉列表选择值。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
foxtable
金牌服务用户   /  发表于:2016-5-20 09:01:48
6#
上面的例子是2.0,应该少人用,我用4.0重新做了一个例子:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-5-20 10:29:02
7#
本帖最后由 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的选择的更改,进行更新。下拉框的选择无法更新到数据源里,所以输入框一直为空

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



请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
foxtable
金牌服务用户   /  发表于:2016-5-20 10:45:02
8#
如果不使用Image,可以正常的选择值和输入值。
如果使用Image,则不能正常的选择值,只能输入值。
Image的出现,只不过让选项变得更美观一点而已,和选择值由什么关系呢?

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

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

个人觉得: 这不是一个需求,这是一个大大的bug。
回复 使用道具 举报
foxtable
金牌服务用户   /  发表于:2016-5-20 11:12:58
9#
本帖最后由 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
10#
foxtable 发表于 2016-5-20 10:45
如果不使用Image,可以正常的选择值和输入值。
如果使用Image,则不能正常的选择值,只能输入值。
Image ...

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

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

问题已经提交到产品组,谢谢您反馈的方法。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部