Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: ViewList

C# .NET .NET (C# a Visual Basic) ViewList American English version English version

Aktivity (1)
Avatar
Зайчик
Člen
Avatar
Зайчик:21.10.2012 19:38

Zdravíčko myslel jsem že to pochopím a půjde to :D ale bohužel potřebuju si udělat "viewlist" na seznam uživatelů jsem připojen k MySQL databázi a po projetí DB uživatelema potřebuju vypsat do toho viewlistu všechny uživatele.
aby to vypadalo nějak takto :
http://jpeg.cz/…21/wOsAf.png
ale ty lidi potřebuju přidávat pomocí cyklu když projíždím DB.

// připojení k MySQL
while (read.Read())
            {
                // poslední ID v DB = počet zaregistrovaných
                pocetregistru.Text = read.GetString(0);
                // login
                if (jmeno == read.GetString(1) && heslo == read.GetString(2))
                {
                    nick = read.GetString(3);
                    staty = read.GetString(4);
                }
                else
                {
                    // zatím nic
                }

            }
            connect.Close();

No takže projede to DB pro login když se přihlásím, zapíšu do proměnné nick a staty, které pak dál využiju
ale potřebuju tam právě přidat to zapisování do viewlistu ty uživatele.Poradí mi někdo? :) předem dík.

Odpovědět 21.10.2012 19:38
Коммунизм для нашего будущего!
Avatar
matesax
Redaktor
Avatar
Odpovídá na Зайчик
matesax:21.10.2012 19:45

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...

Editováno 21.10.2012 19:48
 
Nahoru Odpovědět 21.10.2012 19:45
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:21.10.2012 19:53

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);
        }
}
Nahoru Odpovědět 21.10.2012 19:53
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:21.10.2012 19:53

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 :)

Nahoru Odpovědět 21.10.2012 19:53
Коммунизм для нашего будущего!
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:21.10.2012 19:55

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

Editováno 21.10.2012 19:56
Nahoru Odpovědět 21.10.2012 19:55
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:21.10.2012 19:55

ještě bych mel otázečku, když kliknu na nějakýho toho uživatele tak vlastně aby se něco stalo :D 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š :D

Nahoru Odpovědět 21.10.2012 19:55
Коммунизм для нашего будущего!
Avatar
matesax
Redaktor
Avatar
Odpovídá na Зайчик
matesax:21.10.2012 19:59
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...

Editováno 21.10.2012 20:01
 
Nahoru Odpovědět 21.10.2012 19:59
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:21.10.2012 20:00

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

Nahoru Odpovědět 21.10.2012 20:00
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:21.10.2012 20:03

jo ahá já myslel že se to bude dělat krapet jinak :D jsem trošku zmaten z C# ale fajn už to běží díky :)

Nahoru Odpovědět 21.10.2012 20:03
Коммунизм для нашего будущего!
Avatar
matesax
Redaktor
Avatar
Odpovídá na Зайчик
matesax:21.10.2012 20:04

Použij ty labely - nebo ten ListBox - to ti stačí...

 
Nahoru Odpovědět 21.10.2012 20:04
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:21.10.2012 20:07

Ale prd, to že to chci takhle jednoduše teď, neznamená že to takhle jendnoduše budu chtít za měsíc :)

Nahoru Odpovědět 21.10.2012 20:07
Коммунизм для нашего будущего!
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:21.10.2012 20:09

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í.

Nahoru Odpovědět 21.10.2012 20:09
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:21.10.2012 23:09

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

Nahoru Odpovědět 21.10.2012 23:09
Коммунизм для нашего будущего!
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:21.10.2012 23:15

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"];
Editováno 21.10.2012 23:16
Nahoru Odpovědět 21.10.2012 23:15
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:21.10.2012 23:31

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?

Nahoru Odpovědět 21.10.2012 23:31
Коммунизм для нашего будущего!
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:21.10.2012 23:34

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"];
Nahoru Odpovědět 21.10.2012 23:34
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:22.10.2012 0:34

Jéžíš to jsem z toho jelen, si připadám jako idiot :D
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 :D 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 :D 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 :)

Nahoru Odpovědět 22.10.2012 0:34
Коммунизм для нашего будущего!
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:22.10.2012 0:52

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.

Editováno 22.10.2012 0:53
Nahoru Odpovědět 22.10.2012 0:52
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:22.10.2012 11:36

No hurá, fixed :D díky

listView1.Items.Add(new ListViewItem() { Text = panda, Group = listView1.Groups["listViewGroup1"] });
Nahoru Odpovědět 22.10.2012 11:36
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:23.10.2012 21:52

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 :)

Nahoru Odpovědět 23.10.2012 21:52
Коммунизм для нашего будущего!
Avatar
matesax
Redaktor
Avatar
Odpovídá na Зайчик
matesax:23.10.2012 22:00

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++)
         ...
Editováno 23.10.2012 22:03
 
Nahoru Odpovědět 23.10.2012 22:00
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:23.10.2012 22:05

Mělo by to být nějak takto:
novy.Text je jmeno
Pak si dáš listView1.Items[INDEX].SubItems

Nahoru Odpovědět 23.10.2012 22:05
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:23.10.2012 22:07

Ale to dostanu jen kolik je subhodnot řádku ne?

Nahoru Odpovědět 23.10.2012 22:07
Коммунизм для нашего будущего!
Avatar
matesax
Redaktor
Avatar
Odpovídá na Зайчик
matesax:23.10.2012 22:08
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ři­dávání... A tedy i bez cyklů - to je mnohem lepší řekl bych...

Editováno 23.10.2012 22:11
 
Nahoru Odpovědět 23.10.2012 22:08
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:23.10.2012 22:10

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áží.

Nahoru Odpovědět 23.10.2012 22:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:23.10.2012 22:11

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...

Editováno 23.10.2012 22:14
 
Nahoru Odpovědět 23.10.2012 22:11
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:23.10.2012 22:18

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++)
 
Nahoru Odpovědět 23.10.2012 22:18
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:23.10.2012 22:19

Reagoval jsem jen na ten kus programu, který jsi zplodil. Vkládat subitemy po jednom musí být děsně neefektivní.

Nahoru Odpovědět 23.10.2012 22:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:23.10.2012 22:23

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í...

Editováno 23.10.2012 22:24
 
Nahoru Odpovědět 23.10.2012 22:23
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:23.10.2012 22:28

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.

Nahoru Odpovědět 23.10.2012 22:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:23.10.2012 22:32

Osobně bych ale místo DataGirdView použil raději DataGridView.

Nahoru Odpovědět 23.10.2012 22:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:23.10.2012 22:32

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... :)

Editováno 23.10.2012 22:34
 
Nahoru Odpovědět 23.10.2012 22:32
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:23.10.2012 22:41

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.

Nahoru Odpovědět 23.10.2012 22:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:23.10.2012 22:44

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á...

Editováno 23.10.2012 22:46
 
Nahoru Odpovědět 23.10.2012 22:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:23.10.2012 22:53

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.

Nahoru Odpovědět 23.10.2012 22:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:23.10.2012 23:03

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...

Editováno 23.10.2012 23:06
 
Nahoru Odpovědět 23.10.2012 23:03
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:23.10.2012 23:09

Neco.Text = listView1.Selec­tedItems[0].Su­bItems[0].Tex­t;

To bylo tak těžké mi poradit tohle? :) To je to co jsem potřeboval :)

Nahoru Odpovědět 23.10.2012 23:09
Коммунизм для нашего будущего!
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík:23.10.2012 23:11

Šak to jsem ti psal ;)

Nahoru Odpovědět 23.10.2012 23:11
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Зайчик
matesax:23.10.2012 23:11

Bylo - když se někdo zeptá na triviálnost, čekám něco težšího... :)

Pužij ale DataGridView... :)

 
Nahoru Odpovědět 23.10.2012 23:11
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:23.10.2012 23:15

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í.

Nahoru Odpovědět 23.10.2012 23:15
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик:23.10.2012 23:16

Aha tak promiň , já jsem to z toho nějak nepochopil (makeup)

Nahoru Odpovědět 23.10.2012 23:16
Коммунизм для нашего будущего!
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:24.10.2012 6:14

A?... :)

 
Nahoru Odpovědět 24.10.2012 6:14
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:24.10.2012 12:01

B! ... :)

Jsou 2 možnosti:

  1. na desktopu používám serverové databáze v plné verzi, včetně schématu
  2. Microsoft používá na serveru desktopové databáze a na desktopu odpad, ke kterému má C# jen primitivní ovladače

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á.

Nahoru Odpovědět 24.10.2012 12:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 43 zpráv z 43.