Winforms Listbox,尽管Drawmode被OwnerDrawFixed,如何使显示成员工作?

Posted

技术标签:

【中文标题】Winforms Listbox,尽管Drawmode被OwnerDrawFixed,如何使显示成员工作?【英文标题】:Winforms Listbox, how to make a displaymember work despite the Drawmode being OwnerDrawFixed? 【发布时间】:2020-08-30 20:29:47 【问题描述】:

我一直试图在我的列表框中添加不同颜色的项目,结果偶然发现了this Link。我尝试将它实施到我的项目中。但是现在我有一个大问题:列表框的数据源是一个绑定列表,并且有一个工作显示成员和所有东西,但是在插入这个之后(这是颜色更改工作所必需的):

lbx_robots.DrawMode = DrawMode.OwnerDrawFixed;

显示成员似乎被忽略了,我只看到 Robogotchi.Robot 而不是看到项目的名称,所以就像我根本没有显示成员时一样。

大部分问题代码所在的类:

public Robogotchi()
    
        InitializeComponent();

        //test BEGIN; DELETE LATER
        Robot robot = new Robot();
        robot.State = Robot.stateofrobot.Einwandfrei;
        robot.Name = "test";
        int abc = Convert.ToInt32(robot.State);
        robotlist.Add(robot);
        lbx_robots.DataSource = robotlist;
        lbx_robots.DisplayMember = "Name";
        lbx_robots.Refresh();


        //test END; DELETE LATER

        //stuff to change the color of listbox items
        //lbx_robots.BackColor = Color.Beige;
        lbx_robots.DrawMode = DrawMode.OwnerDrawFixed;
        lbx_robots.DrawItem += new DrawItemEventHandler(listBox1_SetColor);
    

这是我运行后出现在我的列表框中的内容: Screenshot of my Listbox with displaymember not working

【问题讨论】:

您应该发布listBox1_SetColor 的代码,但我的直觉是您正在遵循您链接的示例。在那种情况下,当您拥有Robot 对象时,您不想调用ToString(),而是直接读取其Name 属性(当ownerdraw 由您决定时,控件不会这样做)。 【参考方案1】:

编辑:我刚刚解决了它: 在网站的代码中有一行说

.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(),
            e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);

当我把它改成:

e.Graphics.DrawString((((ListBox)sender).Items[e.Index] as Robot).Name,
            e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);

成功了。

【讨论】:

以上是关于Winforms Listbox,尽管Drawmode被OwnerDrawFixed,如何使显示成员工作?的主要内容,如果未能解决你的问题,请参考以下文章

程序不会让我以任何方式清除我的 listBox [C#, WinForms]

WinForms ListBox 控件上的多行列表项?

如果内容字符串宽度大于 ListBox 宽度,Winforms DotNet ListBox 项目以自动换行?

Winforms ListBox 控件在源更改后不更新

在 WinForms 中将 Listbox 绑定到 List<object>

C# Winforms:没有 AutoScroll 的滚动条