Список Winforms, как заставить displaymember работать, несмотря на то, что Drawmode является OwnerDrawFixed?

Я пытался добавить элементы разного цвета в свой список и наткнулся на эта ссылка. Я попытался внедрить его в свой проект. Но теперь у меня есть большая проблема: источником данных списка является Binding List, в нем есть рабочий Displaymember и все такое, но после его вставки (что необходимо для изменения цвета):

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);
    }

И вот что появляется в моем списке, когда я его запускаю: Снимок экрана моего списка с неработающим дисплеем< /а>


person Julian Kruste    schedule 14.05.2020    source источник
comment
Вы должны опубликовать код listBox1_SetColor, но я чувствую, что вы следуете приведенному вами примеру. В этом случае, когда у вас есть объект Robot, вы НЕ хотите вызывать ToString(), а напрямую читать его свойство Name (когда владелец отрисовывает это на ваше усмотрение, элемент управления не будет этого делать).   -  person Adriano Repetti    schedule 14.05.2020


Ответы (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);

Это сработало.

person Julian Kruste    schedule 14.05.2020