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]
如果内容字符串宽度大于 ListBox 宽度,Winforms DotNet ListBox 项目以自动换行?