Diskuze: ViewList
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 43 zpráv z 43.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
No moc tě nechápu - co řešíš... Vzhledem k tomu, že chceš jen přidávat jména, bych ListView
vůbec nepoužíval... Ale přidáváš do něj normálně ListViewItem:
listView1.Items.Add(new ListViewItem() { Text = "Toto se to bude zobrazovat jako text položky." });
Větší smysl to má však pro soubory, či tak - protože si tam nastavíš subitemy - datum poslední změny, velikost,...
Takže toto bych řešil třeba labely... (Listem labelů.) Mohl by jsis i udělat vlastní Control - něco jako ve VB - buttonarray... Každému labelu dáš stejnou metodu na kliknutí a v ní rozdělíš switchem (podle senderu)...
A on tu bude možná zbytečný i ten Label - stačilo by jen vykreslovat List/pole stringu - a to do jednoduchých boxů - s nějakým tím hover efektem...
Přidání:
contactListView.Items.Add(new Contact(...));
Pokud chceš vlastní vykreslování, tak OwnerDraw = true;
a
pak:
private void contactListView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
if (e.ItemIndex == -1) return;
using (Brush textBrush = new SolidBrush(Color.White))
{
// rámeček
if (((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected) || (e.Item.Selected == true))
{
e.Graphics.FillRectangle(Brushes.MediumSeaGreen, e.Bounds);
e.Graphics.DrawRectangle(new Pen(Brushes.DarkGreen), e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1);
textColor = Brushes.White;
}
else
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
// avatar
e.Graphics.DrawImage(contactAvatar, e.Bounds.Left + 1, e.Bounds.Top + 1, 26, 26);
// jméno
e.Graphics.DrawString(contactName, e.Item.Font, textColor, e.Bounds.Left + 2 + 40, e.Bounds.Top + 1);
}
}
Jo super, to jsem potřeboval vědět!
listView1.Items.Add(new ListViewItem() { Text = "Toto se to bude zobrazovat jako text položky." });
Díky!:) Já bych to taky udělal přes labely ale takhle je to víc sexy
Pokud to chceš jen takhle jednoduše, tak si mého příspěvku nevšímej. Já beru, že kontakt má více vlastností a chci s nimi pracovat a vykreslovat je.
Edit: Na to by ti možná stačil i ListBox
ještě bych mel otázečku, když kliknu na nějakýho toho uživatele tak
vlastně aby se něco stalo
koukal jsem a vlastně se to bralalo jako když jsem kliknul na celej ten
viewlist potřebuju to mít vlastně jako seznam uživatelů jako ty to máš v
tom messengeru tak aby přesně po kliknutí na nějakýho uživatele se stalo
to a to
snad mě chápeš
for (int index = 0; index < texty.Length; index++)
{
Label item = new Label() { Text = texty[index], Name = "Label" + index, Location = new System.Drawing.Point(20, index * 20) };
item.Click += new EventHandler(Labels_Click);
Controls.Add(item);
}
private void Labels_Click(object sender, EventArgs e)
{
switch ((sender as Label).Name)
{
case "Label0":
break;
case "Label1":
break;
}
}
Myslím si, že budeš dělat pro všechny položky skoro stejnou věc - proto tam možná bude stačit místo switche jen zavolat nějakou metodu s jménem získaným z převedeného senderu...
Je tam event MouseDoubleClick
nebo MouseUp
. Podle
toho co konkrétně chceš. U MouseUp
si můžeš dát podmínku
které tlačítko a kolikrát bylo zmáčknuto.
No a pak máš buďto -> contactListBox.SelectedItems[0]
u
DoubleClicku (protože to ti ten item vybere) nebo
contactListView.GetItemAt(e.X, e.Y);
u MouseUp.
Index pak získáš:
int index = contactListView.Items.IndexOf(item);
jo ahá já myslel že se to bude dělat krapet jinak jsem trošku zmaten z C# ale
fajn už to běží díky
Ale prd, to že to chci takhle jednoduše teď, neznamená že to takhle
jendnoduše budu chtít za měsíc
Ono na tohle by se měl používat ten ListView. Má více možností a v
tomhle případě je určitě zužitkuješ
Možná si tam vytvoř nějakou předlohu pro kontakt a pak tam dávej přímo
instanci toho kontaktu. A s tou pak pracuj. Přepíšeš metodu
ToString
tomu kontaktu -> to ti vrátí například jeho jméno
a pak si třeba uděláš i vlastní vykreslování.
Prosím tě ještě jsem se chtěl zeptat když chci text přidávat do skupiny (group) tak jak bych to měl udělat? Jsem googlil a našel jsem
prateleview.Items.Add(new ListViewItem() { Text = "neco", Group = NAZEVSKUPINY});
Ale pořád mi to píše chybu že neexistuje poradíš mi jak na to? Nebo by stačil nějaký link kde je to vysvětlený ale co jsem googlil vždy v tom bylo X dalších věcí a měl jsem z toho akorát guláš a pak jsem našel právě že se to přidává za Text
Musíš tu skupinu nejdřív vytvořit. Normálně na ten ListView klepneš a dáš Edit Groups. Případně:
ListViewGroup listViewGroup = new ListViewGroup("název skupiny", HorizontalAlignment.Center);
prateleview.Groups.Add(listViewGroup);
A pak třeba
item.Group = prateleview.Groups["název skupiny"];
Ale já mám vytvořenou skupinu jmenuje se "listViewGroup1" a když píšu
panda = read.GetString(1);
prateleview.Items.Add(new ListViewItem() { Text = panda,Group = listViewGroup1 });
a píše mi to ze listViewGroup1 neexistuje tak tam bude někde asi chyba v tom zápisu ne?
Tu skupinu přidáš do toho ListView a pak na ni odkazuješ přes něj.
prateleview.Groups.Add(listViewGroup);
item.Group = prateleview.Groups["název skupiny"];
Jéžíš to jsem z toho jelen, si připadám jako idiot
takže vytvořím si skupinu ne? Kliknu na ten listview edit groups...
add...
vytvoří se mi nová (první) s indexem 0 a nazvem listViewGroup1. Fajn skupinu
mám a teď chci zapsat do ty
skupiny nějaké data...
string jmena;
while (read.Read())
{
jmena = read.GetString(1); // jmena z databáze
listView1.Items.Add(new ListViewItem() { Text = jmena });
TAK! Když to udělám takhle tak se mi vypíšou pěkně všechna jména do
listview1 ale do základní skupiny... "Default" ale to já nechci já to potřebuju zapsat do tý
skupiny co jsem si vytvořil alias listViewGroup1 ..
co teda mám upravit v tom kódu?
listView1.Items.Add(new ListViewItem() { Text = jmena });
aby se mi to zapisovalo do skupiny listViewGroup1 ? a né do Defaultní
skupiny? Promin příjdu si jak idiot to co si mi psal je jen na vytvoření nějaké skupiny a tu já už
vytvořenou mám já potřebuju jen zapsat do ní neco
Buďto:
item.Group = listView1.Groups["název skupiny"];
Nebo při přidávání:
new ListViewItem() { Text = jmena, Group = listView1.Groups["název skupiny"] }
Místo "název skupiny" můžeš použít i index.
No hurá, fixed
díky
listView1.Items.Add(new ListViewItem() { Text = panda, Group = listView1.Groups["listViewGroup1"] });
Ještě mám dotaz udělal jsem si teda listview s nazvem "listView1" a ukádám do něj pomocí cyklu hodnoty z DB. A potřebuju nějak dostat hodnotu z toho listviewu, která se načte z DB ( mám view na details ) a použil jsem columns místo skupin.
ListViewItem novy = new ListViewItem(jmeno);
novy.SubItems.Add(adresa);
novy.SubItems.Add(typ);
novy.SubItems.Add(id);
listView1.Items.Add(novy);
Tím se mi vlastně vykreslej hodnoty do toho listviewu, a teď, jak z toho
dostanu třeba hodnotu jméno? nebo adresu? Díky
Ale ne - na db používej DataGirdView + DataBinding a DataSet - nebo LINQ To SQL...
Jinak:
foreach (ListViewItem lvi in listView1.Items)
for (int index = 0; index < lvi.SubItems.Count; index++)
...
Mělo by to být nějak takto:
novy.Text
je jmeno
Pak si dáš listView1.Items[INDEX].SubItems
foreach (ListViewItem lvi in listView1.Items)
for (int index = 0; index < lvi.SubItems.Count; index++)
lvi.SubItems[index]
Docela jasné ne?
Ale mnohem lepší by tu byl ten DataGirdView - přes Binding - ten je pak chopen editovat přímo data - jednotlivé Column - bez kódu... - jen povolíš editace/mazání/přidávání... A tedy i bez cyklů - to je mnohem lepší řekl bych...
Taková naivní otázka: Proč se načítání tabulky z databáze musí v C# dělat dvojitým cyklem, když v jiných jazycích se to dělá jednoduchým nebo žádným? Zbývající jsou programátorovi skryty a nepřekáží.
Co? Podívej se na můj program pro práci s databází - jde to bez cyklů - když umíš dotazy, můžeš si vyžádat jen určitá data - já bych to řešil přes dotazy a binding...
A když použiješ ten binding na DataGirdView - tak tím DataGirdView můžeš data ovládat přímou cestou...
Kite copak to bere data z databáze? (Prohlédni si ten kód...)
foreach (ListViewItem lvi in listView1.Items)
for (int index = 0; index < lvi.SubItems.Count; index++)
Reagoval jsem jen na ten kus programu, který jsi zplodil. Vkládat subitemy po jednom musí být děsně neefektivní.
Po kolikáté - já bych použil DataGirdView - přes binding a tak bych nepotřeboval ani kus kódu... (Tedy akorát nastavování DataSet a TableAdapter (3 řádky) - u lokální DB - u serverové asi úplně bez kódu...)
Jak se můžeš chytat špatně vymyšleného systému - napadáš C# za každou cenu - přitom toto je zrovna neefektivní řešení a za to C# nemůže...
Nesplodil jsem kód pro vkládání subitemů - to ani nejde tím mým
kódem... Je to jen pro
čtení...
No co? Vidím průchod seznamem a v každém záznamu se projíždí polem. Tak mi to připadlo divné. Teď už vím, že je to překonaná technika a že se to dá udělat lépe. Tak se tím už nemusíš zabývat.
Osobně bych ale místo DataGirdView použil raději DataGridView.
To není překonaná technika - ListView se nikdy na databázi
nepoužíval... (Kdyby chtěl jen seznam jmen - možná - ale na ten by
nepotřeboval databázi... )
Jak píši - C# nemůže za špatně navržený kód... Překonanou techikou je
spíše TableAdapter + jeho ovládání - převládá LINQ to SQL - ovšem LINQ
to SQL lze použít jen u serverové databáze - takže u lokální neznám
jiné řešení - proto jsem napsal ten program...
Píši bez brýlí - vždyť již skoro spím...
To jsem netušil, že tam takové omezení databází. Na desktopu mám všechny databáze v plné verzi, tak mi to nepřijde.
Jaké omezení? Naopak - vždyť to je nadstavba... Lokální databáze neobsahuje
schéma, které obsahuje serverová - proto na ní nelze použít LINQ to SQL.
Ale dá se ovládat třeba SQL dotazy, TableAdapterem + DataSet...
Kdo se tu bavil o poloviční verzi? Je snad logické, že lokální db má jinou strukturu, než serverová...
Lokální DB má jinou strukturu, než serverová? Mně to logické nepřijde. Mám na desktopu úplně stejné databáze, jaké se používají v serverech a považuji to za standard.
Nevím, čemu říkáš schéma databáze, ale ve svých databázích ho mám.
No jak to mám jinak napsat, když se to jmenuje schéma? (Taková databáze se navrhuje v
SQL SMS - SQL Server Management Studio - a navrhuješ tam právě její
schéma...) Kdežto lokální obsahuje jen 2 základní struktury - jedna z ní
jsou tabulky.
http://msdn.microsoft.com/…d207005.aspx
A právě kvůli rozdílné struktuře je i rozdílný přístup... A logické to je - lokální má nulové nároky - neřeší se tu vlastně nic...
Neco.Text = listView1.SelectedItems[0].SubItems[0].Text;
To bylo tak těžké mi poradit tohle? To je to co jsem potřeboval
Bylo - když se někdo zeptá na triviálnost, čekám něco težšího...
Pužij ale DataGridView...
Zrovna čtu, že schéma MSSQL se skládá z:
table_definition | view_definition | grant_statement | revoke_statement | deny_statement
To má přece i MySQL, PostgreSQL a částečně i SQLite (neřeší granty). Bezschémové sice schéma nemají, ale to mě netrápí.
Aha tak promiň , já jsem to z toho nějak nepochopil (makeup)
B! ...
Jsou 2 možnosti:
Tak si vyber. Myslím si, že 1. varianta bude pro tebe přijatelnější. Lokální databáze nemusí mít jinou strukturu než serverová.
Zobrazeno 43 zpráv z 43.