C# Listbox - nie wyświetla wartości z ToString

0

Witam,

Stworzyłem własny obiekt, który dziedziczy po PictureBox. Przeciążyłem w nim ToString aby zwracał odpowiedni dla mnie opis. Wszystko dziła w porządku do czasu gdy dodaję listę obiektów do ListBox'a. Obiekty są dodawane jednak nie pojawia się ich nazwa na liście. Jedyne co znalazłem na ten temat to wyłączenie programu antywirusowego, który może blokować override metod, ale to nie pomogło.

Klasa, którą dodaję do ListBox'a

public class PictureBoxRouter: PictureBox
	{
                public PictureBoxRouter(string p_name, int p_serial, int p_ethernet)
		{
                     Text = p_name;
                     .....
                }

                public override string ToString()
		{
			return this.Text;
		}
        }

Miejsce dodania obiektów do ListBox'a

public partial class ConnectGui : Form
	{
		public ConnectGui()
		{
			InitializeComponent();
		}
                public void setDevicesList(List<PictureBoxRouter> p_deviceList)
		{
			devList = p_deviceList;
			listDevices.BeginUpdate();
			foreach (PictureBoxRouter boxRouter in p_deviceList)
			{
				if (boxRouter.HasInterfaces)
				{		
					if (boxRouter.Id != currentRouterId)
					{
						listDevices.Items.Add(boxRouter);
					}
				}
			}
			listDevices.EndUpdate();
		}
      }

Może spotkał się już ktoś z takim problemem?

Pozdrawiam

0

co ma do tego antywirus ? O_o

a może tak dopiszesz .ToString() bo listbox przyjmuje elementy typu "object" więc mu wszystko jedno co mu podasz, nie będzie tego rzutował na stringa

0

a w ogóle to gratuluję umiejętności nazywania zmiennych i kontrolek w sposób który daje wrażenie że się patrzy na bardziej skomplikowany kod niż jest w rzeczywistości

0
gdfgsdg napisał(a)

co ma do tego antywirus ? O_o

a może tak dopiszesz .ToString() bo listbox przyjmuje elementy typu "object" więc mu wszystko jedno co mu podasz, nie będzie tego rzutował na stringa

To że ListBox wszysto jedno co dostanie jako argument to wiem, ale mi nie jest wszystko jedno. Zależy mi na tym, aby znalazły się w nim obiekty konretnego typu, do których bezpośrednio mogę się odwołać, a nie same stringi.

0

aha no ale jak widać listbox przy wyświetlaniu nie stosuje .ToString, spróbuj dodać "czysty" PictureBox i zobaczysz że też się nie wyświetli "oczekiwane" "System.Windows.Forms.PictureBox"
jedyne wyjście jakie mi przychodzi do głowy to niestety ownerdraw

0

kombinowałem na różne sposoby i szczerze mówiąc nie wiem jak to poprawnie rozwiązać
jedyne co mi zadziałało to:

    costam jakiescos = new costam(50);
    listBox1.Items.Add(jakiescos.item);

...

    public class Tekst
    {
        public costam parent;

        public Tekst(costam Parent)
        {
            this.parent = Parent;
        }

        public override string ToString()
        {
            return parent.Text;
        }
    }

    public class costam : PictureBox
    {
        public Tekst item;
        public int dane;

        public costam(int dane) : base()
        {
            this.dane = dane;
            item = new Tekst(this);
            this.Text = "costam";
        }
    }
}

i potem odwołania typu:

(SelectedItem as Tekst).parent.dane

ale to jakieś naciagane

0
MSDN napisał(a)

PictureBox.Text Property

This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

0
adf88 napisał(a)

... and is not intended to be used directly from your code or i'll kill your mom and burn your house.

dobra nie ważne, chodziło o przykład, zresztą akurat to nie jest ważne w tym kodzie i można se wpisać co się chce
na początku myślałem że może to Text się pojawi w listboxie

zamiast tego może byś zaproponował własne rozwiązanie ?

0
adf88 napisał(a)
MSDN napisał(a)

PictureBox.Text Property

This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.
To samo się tyczy metody ToString.

A rozwiązanie może być takie:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void setDevicesList(List<PictureBoxRouter> p_deviceList)
        {
            devList = p_deviceList;
            listDevices.BeginUpdate();
            listDevices.DataSource =
                (from boxRouter in devList
                where boxRouter.HasInterfaces && boxRouter.Id != currentRouterId
                select boxRouter).ToArray();
            listDevices.DisplayMember = "RouterName";
            listDevices.EndUpdate();
        }

        //...
    }

    public class PictureBoxRouter : PictureBox
    {
        private string routerName;
        
        public PictureBoxRouter(string p_name, int p_serial, int p_ethernet)
        {
            routerName = p_name;
            //...
        }

        public string RouterName { get { return routerName; } }

        //...
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1