Przeszukałem dużo stron i nie mogę znaleźć lub może nie wiedziałem jak użyć metody do zaznaczenia item'u w listBox'ie. Chodzi mi o to, że dodałem do tablicy zczytane z textBox'ow dane i jeden z nich zawsze też dodaję do listBox'a. Np wpisuje do jednego textboxa imię, do drugiego np nr tel itd i dodaje to do tablicy. Utworzona jest oczywiście klasa i tablica jest typu klasy. I imię dodaje tez do listBoxa żeby mieć jakby 'odnośnik' i mam np 3 itemy w listoboxie powiedzmy Marysia, Zosia, Asia i jak kliknę na Zosia a potem na button Wyświetl chciałbym, żeby w jednym textboxie wyskoczyło jej imię, w drugim nr tel itd, czyli wszystkie te wartości które były wpisane i dodane do tablicy. Nie mogę tego nigdzie znaleźć a jak coś znalazłem to nie działało. Dokładnie chodzi o wyświetlenie wartości kryjących się pod zaznaczonym itemem
Pokaż jak dodajesz do listBoxa
i jak wyciągasz. A tak naprawdę wszystkie potrzebne przykłady są tutaj: http://msdn.microsoft.com/pl-pl/library/system.windows.forms.listbox(v=vs.110).aspx wystarczy poklikać.
listBox1.Items.Add(lista[i].imie)
tak dodaję. I nie mam pojęcia jak zrobić, żeby jak zaznaczę to imię w listBoxie i kliknę Wyświetl to w trzech innych textBoxach wyswietlilo się właśnie imię, nazw i tel, bo za każdym razem wyświetla mi tylko pierwszy item z listBoxa
Dodawaj całą klasę a nie tylko imię do listy:
listBox.Items.Add(new Person {Name = "Jan", LastName = "Kowalski", Phone = "+48 555 777 666"});
Ustaw co ma być wyświetlane na liście:
listBox.DisplayMember = "Name";
Wyciągaj wartości za pomocą SelectedItem
to już @_13th_Dragon podał.
var person = listBox.SelectedItem as Person;
http://msdn.microsoft.com/pl-pl/library/system.windows.forms.listcontrol.datasource(v=vs.110).aspx
dodanie znaczników <code class="csharp">
- @furious programming
Pokażę ci na przykładzie listy.
{
int n = FBaza.Items.Count - 1;
for ( int h = 0; h <= n; h++ )
{
if (FBaza.GetSelected(h))
{
FNumer.Text = h.ToString();
FImie.Text = ListaOsob[h].imie;
FTel.Text = ListaOsob[h].tel.ToString();
FRok.Text = ListaOsob[h].rok.ToString();
}
}
Pozdrawiam.
Kompletnie bez sensu czemu przechodzisz cała listę sprawdzając który element jest zaznaczony zamiast wziąć od razu ten właściwy? Przekombinowałeś. Pokażę bez użycia GetSelected()
:
using System;
using System.Collections.ObjectModel;
using System.Windows.Forms;
namespace WindowsFormsApplicationTest
{
public partial class Test : Form
{
public Test()
{
InitializeComponent();
listBox.Items.Add(new Person {Name = "Jan", LastName = "Kowalski", Phone = "+48 555 777 666"});
listBox.Items.Add(new Person {Name = "Janusz", LastName = "Nowak", Phone = "+48 333 777 666"});
listBox.Items.Add(new Person { Name = "Ana", LastName = "Januszewska", Phone = "+48 999 777 666" });
/*
// Lub...
listBox.DataSource = new ObservableCollection<Person>
{
new Person {Name = "Jan", LastName = "Kowalski", Phone = "+48 555 777 666"},
new Person {Name = "Janusz", LastName = "Nowak", Phone = "+48 333 777 666"},
new Person {Name = "Ana", LastName = "Januszewska", Phone = "+48 999 777 666"}
};
*/
listBox.DisplayMember = "Name";
}
// Chciałeś wyświetlanie po kliknięciu przycisku to masz. :P
private void buttonShow_Click(object sender, EventArgs e)
{
var person = listBox.SelectedItem as Person;
if (person != null)
{
textBoxName.Text = person.Name;
textBoxLastName.Text = person.LastName;
textBoxPhone.Text = person.Phone;
}
}
}
public class Person
{
public string Name { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
}
}
Ok, jakoś sobie poradziłem, ale mam inny problem. Wszystko to dodaje do tablicy a tylko imię pojawia się w listBoxie tak jak chciałem. Ale jak usunąć cały 'rekord' z tablicy i imie z listBoxa? Wiem, że trzeba poprzedni element nadpisać kolejnym, ale coś nie działa. Z listBoxa robie listBox1.Items.Clear() i potem od nowa robię z uaktualnionej tablicy, ale nie działa mi te 'usuwanie', więc nie wiem czy Clear'em jest dobrze
Nie używaj tablic, jeśli masz coś usuwać to do tego służą kolekcje.
Pokaż jak to zrobiłeś.
A po co chcesz mieć te same dane w dane w tablicy i w ListBox? Przecież chyba w samym ListBox Ci wystarczy tam możesz dodawać, usuwać i modyfikować te dane. Czego więcej Ci potrzeba?
w listboxie1 mam miec jakby tylko 'odnosnik', a w tablicy przechowywane dane
Ale po co Ci to, zamiast komplikować przyjrzyj się przykładowi od @DibbyDum.
cześć, robiłem podobny program i mam taki problem że po dodaniu osoby do listboxa w listbox wyświetla się
WindowsFormsApllication1.Form1+Osoba
poza tym wszystko działa
kod dodawania osoby wygląda tak
private void Dodaj_Click(object sender, EventArgs e)
{
Osoba os = new Osoba();
{
os.imie = textBox1.Text;
os.numer = textBox2.Text;
os.rok = textBox3.Text;
}
listBox1.Items.Add(os);
textBox1.Text = " ";
textBox2.Text = " ";
textBox3.Text = " ";
listBox1.DisplayMember = os.imie;
}
Bo chyba powinno byc:
listBox1.DisplayMember = "imie";
nie, niestety dalej to samo :|
Nie jestem pewny ale możliwe że imie
musi być właściwością a z polem klasy to nie działa. Co to jest u Ciebie?
Ewentualnie możesz nadpisać ToString
w klasie Osoba
.
public override ToString()
{
return name;
}
imie to pole klasy Osoba i jest stringiem
no to w ToString klasy Osoba piszesz
return Imie;
Imie musi być propertem, nie polem żeby można było skorzystać z kodu powyżej, duże / małe litery mają znaczenie (propert powinien być z dużej)
akwamorela napisał(a):
Imie musi być propertem, nie polem żeby można było skorzystać z kodu powyżej, duże / małe litery mają znaczenie (propert powinien być z dużej)
miałem na myśli skorzystanie z DisplayMember
Więc spróbuj zamienić to pole na właściwość, czyli:
public string imie {get;set;} // a w zasadzie to powinno być Imie (z dużej litery)
Dzięki wielkie, problem rozwiązany :)