none
VB2008EX,请教个问题:能不能在ComboBox的下拉菜单下同时显示图标和文字(就像Word右键菜单的形式,有图标有文字)? RRS feed

  • 问题

  • 如题。

    ComboBox里边只显示文字,能不能同时显示图片,这样图文并茂的更清楚些。没有一点儿头绪。本人初学者,还请的简单些。

    msdn上说好像ObjectCollection可以修改显示的内容但是好像还是单一的类型(并不能同时显示文本和图片)。

    多谢了。
    2009年6月15日 7:42

答案

  • 你好!
         可以自己扩展ComboBox来实现:
    http://www.cnblogs.com/chenyu0720/archive/2008/01/24/1051857.html
    周雪峰
    2009年6月15日 8:39
    版主

全部回复

  • 你好!
         可以自己扩展ComboBox来实现:
    http://www.cnblogs.com/chenyu0720/archive/2008/01/24/1051857.html
    周雪峰
    2009年6月15日 8:39
    版主
  • 谢谢你提供的思路。

    需要更多的学习。不过我只能看懂VB的代码。试试看吧。
    2009年6月15日 9:56
  • 实际上C#应该也能看懂的,大概差别不大,遇到问题可以来论坛提问,大家和我都会帮助你的啊!
    周雪峰
    2009年6月15日 10:55
    版主
  • 实际上C#应该也能看懂的,大概差别不大,遇到问题可以来论坛提问,大家和我都会帮助你的啊!
    周雪峰

    谢谢。

    我找到了VB的例子,但是有的地方看不懂,还请帮忙解释一下。原贴地址:
    http://social.msdn.microsoft.com/Forums/en-US/winformsdesigner/thread/36ee6194-621c-4e1a-96b7-e14afe77d409
    但是这个代码好像并不完全正确。

    还有个地方也有类似的代码:
    http://www.codeproject.com/KB/cpp/ImageComboBox_VBNET.aspx

    我有这么几个问题:

    Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
    .
    .
    .
    Try
                item = Me.Items(e.Index)
                If (item.ImageIndex <> -1) Then
                    Me.ImageList.Draw(e.Graphics, bounds.Left, bounds.Top, item.ImageIndex)
                    e.Graphics.DrawString(item.Text, e.Font, New SolidBrush(e.ForeColor), bounds.Left + imageSize.Width, bounds.Top)
                Else
                    e.Graphics.DrawString(item.Text, e.Font, New SolidBrush(e.ForeColor), bounds.Left, bounds.Top)
                End If
            Catch ex As Exception
                If (e.Index <> -1) Then
                    e.Graphics.DrawString(Items(e.Index).ToString(), e.Font, New SolidBrush(e.ForeColor), bounds.Left, bounds.Top)
                Else
                    e.Graphics.DrawString(Text, e.Font, New SolidBrush(e.ForeColor), bounds.Left, bounds.Top)
                End If

            End Try
            MyBase.OnDrawItem(e)
    End Sub


       
    MyBase.OnDrawItem(e)怎么解释?能不能看作引用基类的OnDrawItem来执行Override中的修改?


    Public Overrides Function ToString() As String
            Return _text
    End Function
    这个是干什么用的?查了查,还是不明白为什么要这么做。

    谢谢。





    2009年6月16日 12:27
  • 我现在明白了,要实现这个功能关键就是下拉菜单必须要先填充些东西进去(这里指的是String),然后再显示这个"预定义"好的列表时,用e.Graphics分别把图片和文字“画出来”。

    定义类,不定义类,都可以实现这个功能。

    以下地址是除了定义类的方法以外的另一个方法。供大家参考。

    http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/f470e248-4ac4-4974-a5ea-7606372d5258

    http://www.devasp.net/net/articles/display/365.html

    两个地址讲的是一样的东西。
    2009年6月19日 6:48
  • 对,就是这个意思啊!
    周雪峰
    2009年6月19日 7:34
    版主
  • 谢谢版主。

    你,还有raymond给了我很多的帮助。以前的那些窗体操所问题也都明白了。觉得有必要说声谢谢。

    2009年6月19日 7:43
  • 不客气啊!
    欢迎常常来这里和大家交流啊!

    周雪峰
    2009年6月19日 8:00
    版主
  • 好了,发个总结吧。

    1 要实现这个功能关键就是下拉菜单必须要先填充些东西进去(这里指的是String),然后再显示这个"预定义"好的列表时,用e.Graphics分别把图片和文字“画出来”。

    2 ComboBox1.Items.AddRange() 和 ComboBox1.DataSource 的用法虽然相似,但是前者在初始化ComboBox1后并不在TextBox中填充第一项。

    3 如果使用ComboBoxStyle.DropDown而且定义ComboBox1.ItemHeight则不会出现右边的滚动条。

    4 如果设置ComboBoxStyle.DropDown则在TextBox中只显示文字不显示图片,ComboBoxStyle.DropDownList二者都显示。

    最后发一个例子,是MSDN的。我也是刚刚找到。
    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.combobox.drawitem.aspx

    希望能有帮助。
    2009年6月20日 4:39
  • 感谢分享你的经验啊!
    周雪峰
    2009年6月20日 7:54
    版主