Diskuze: Komponenta místo DataGridView

C# .NET .NET (C# a Visual Basic) Komponenta místo DataGridView American English version English version

Avatar
IvoD
Člen
Avatar
IvoD:

Ahoj všichni,

chci se zeptat jakou komponentu byste doporučili/pou­žíváte (popř. jak to řešíte) pro zobrazení seznamu datových řádků we winforms aplikaci, kde položky z jednoho datového řádku na řádku jsou potřeba rozmístit na více řádků, je potřeba použít User Controls apod. (vše nabindované). DataGridView je asi nepoužitelný. Zkoušel jsem DataRepeater z kolekce Visual Basic PowerPacks, ale nepodařilo se mi rozchodit pořádně nabindování User Controlu (změna v objektu se do UC promítne, změna v UC do objektu už ne).

Dík za názory

 
Odpovědět 9.10.2014 8:49
Avatar
Odpovídá na IvoD
Michal Štěpánek:

Zkus trošku upřesnit "kde položky z jednoho datového řádku na řádku jsou potřeba rozmístit na více řádků", nějak jsem to nepobral. Proč je třeba rozmístit údaje z jednoho řádku do více řádků? Když bude jasný důvod, třeba se najde i jiné řešení...

Editováno 9.10.2014 9:10
Nahoru Odpovědět 9.10.2014 9:09
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
IvoD
Člen
Avatar
Odpovídá na Michal Štěpánek
IvoD:

OK - příklad:
potřebuji zobrazit seznam osob (List<Osoba>) a to tak, aby např. titul, jméno a příjmení bylo na prvním řádku, adresa na druhém, telefon na třetím a e-mail na čtvrtém. Jinými slovy potřebuji definovat rozložení polí na ploše reprezentující jeden řádek seznamu.
DataGridView umožňuje rozmístit pole pouze vedle sebe, já je potřebuji i pod sebe. V PowerBuilderu je to typ FreeForm.

Editováno 9.10.2014 9:34
 
Nahoru Odpovědět 9.10.2014 9:33
Avatar
Odpovídá na IvoD
Michal Štěpánek:

A nestačilo by tyto "dodatečné informace" zobrazovat jen někde mimo DGV, třeba v nějakém Labelu po kliknutí na řádek v DGV?

Nahoru Odpovědět 9.10.2014 9:35
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
IvoD
Člen
Avatar
Odpovídá na Michal Štěpánek
IvoD:

Ne, já nechci master-detail, já potřebuji, aby všechno bylo vidět přímo v seznamu a aby bylo možné vložit do řádku User Control ...

 
Nahoru Odpovědět 9.10.2014 9:48
Avatar
vodslon
Člen
Avatar
Odpovídá na IvoD
vodslon:

Ahoj, nemám moc skill :) ale co vkládat tam třeba stackpanely(user control) pro každej záznam zvlášt? I mě by to zajímalo, jak se to má udělat.

public partial class MainWindow : Window
   {
       public MainWindow()
       {
           InitializeComponent();
       }
       List<osoba> ListOsob = new List<osoba>();
       private void Window_Loaded(object sender, RoutedEventArgs e)
       {
           ListOsob.Add(new osoba("Karel", "Vetchý", "vetchy@seznam.cz"));
           ListOsob.Add(new osoba("Jan", "Honzík", "jan@seznam.cz"));
           ListOsob.Add(new osoba("Pepa", "Kolík", "pepik@seznam.cz"));
           foreach (osoba o in ListOsob)
           {
               MujStackPanel MS = new MujStackPanel(o.jmeno,o.prijmeni,o.email);

               ZakladniStackPanel.Children.Add(MS);
           }
       }
   }

   public class MujStackPanel : StackPanel
   {

       public MujStackPanel(string textPrijmeni,string textJmeno,string textEmail)
       {
           Children.Add(VyrobTextBox(textPrijmeni));
           Children.Add(VyrobTextBox(textJmeno));
           Children.Add(VyrobTextBox(textEmail));
       }

       private TextBox VyrobTextBox(string obsahtextu)
       {
           TextBox MujTextBox = new TextBox();
           MujTextBox.Height = 15;
           MujTextBox.Width = 150;
           MujTextBox.Background = Brushes.Aqua;
           MujTextBox.Text = obsahtextu;
           return MujTextBox;
       }
   }

   public class osoba
   {
       public string jmeno{get;set;}
       public string prijmeni { get; set; }
       public string email { get; set; }
       public osoba(string Jmeno,string Prijmeni,string Email)
       {
           jmeno = Jmeno;
           prijmeni = Prijmeni;
           email = Email;
       }

   }
 
Nahoru Odpovědět  -1 9.10.2014 12:24
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na IvoD
Jan Vargovský:

Udělej si usercontrol, který bude reprezentovat tu osobu a pak to narvi tu celou kolekci do FlowLayoutPanelu.

 
Nahoru Odpovědět 9.10.2014 12:55
Avatar
IvoD
Člen
Avatar
Odpovídá na vodslon
IvoD:

Ahoj, to by ale znamenalo všechen layout včetně bindování napsat ručně, osobně se dost divím, že .NET má standartně pouze komponentu pro pravidelný grid a nemá nic pro free-form rozložení :(
Jak jsem psal - lze použít DataRepeater z VB PowerPacku, všechno se dá vizuálně nastavit a všechno mi funguje, pokud teda nepoužiju User Control, u něj se mi nějak nedaří nakonfigurovat, aby změna přes GUI protekla přes bind automaticky do datového objektu (zajímavé je, že změna v datovém objektu do GUI proteče) - dělám někde nějakou chybu. Ale DataRepeater není standartně součástní C#, musí se v rámci VS nainstalovat i VB a pak ta komponenta se asi bude muset na klientském PC ještě asi nějak zaregistrovat. Proto se mi moc nepozdává a hledám nějaké jiné vizuální standartní nebo OpenSource řešení, u kterého by byla možnost vizuálního návrhu a pokud možno se nemuselo nic na klientovi instalovat. Přece nejsem jediný na zeměkouli, který potřebuje free-form editační seznam ???!!!
Tady na Uložto (http://ulozto.cz/…troltest-zip) jsem dal testovací kód toho, jak mi to nechodí - při editaci přes samostatný NumericUpDown (levý) se datový objekt aktualizuje, při editaci přes NumericUpDown vnořený v User Controlu (pravý, modré pozadí) změna do datového objektu nepropadne. Pro otestování je nutné mít nainstalovaný VB PowerPack.

 
Nahoru Odpovědět 9.10.2014 13:12
Avatar
IvoD
Člen
Avatar
Odpovídá na Jan Vargovský
IvoD:

Vyzkouším, ale binding asi budu muset nastavit ručně :( - btw to je Tebou běžně používané řešení nebo si stejnou situaci ještě nemusel řešit?

 
Nahoru Odpovědět 9.10.2014 13:18
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na IvoD
Jan Vargovský:

http://leteckaposta.cz/234466635

Já už přesunul k WPF, kde se dá tohle lépe vyřešit. Ale když jsem dělal ve WFA, tak jsem většinou udělal button, který mi zobrazil ty informace editovatelné. Takhle ten binding můžeš vyřešit jak to je v kódu. Nebo si zachytit všechny text-changed eventy a upravovat to přímo na té instanci a tím si zajistíš ten tu úpravu.

Editováno 9.10.2014 13:40
 
Nahoru Odpovědět 9.10.2014 13:39
Avatar
IvoD
Člen
Avatar
Odpovídá na Jan Vargovský
IvoD:

Dle doporučení na použití FlowLayoutPanelu jsem udělal malé testovací okno a v Load mám:

//      Vytvoření cvičné kolekce dat (reálně bude z DB)
for (int i = 1; i <= 5; i++) {
        Class2 Cl2 = new Class2() { Index = i };
        Sez.Add(Cl2);
}
//      Vytvoření UI
foreach (Class2 Cl2 in Sez) {
        UserControl2 Uc2 = new UserControl2();
        flowLayoutPanel1.Controls.Add(Uc2);
        Uc2.class2BindingSource.DataSource = Cl2;
}

Taky to funguje, jen se mi moc nelíbí, že místo abych datovou kolekci (Sez) vložil celou najednou do jednoho DataSource, tak plním v jednotlivých řádcích (=jednotlivých UC) jejich DataSource hodnotou Sez[i] :(

Editováno 9.10.2014 13:53
 
Nahoru Odpovědět 9.10.2014 13:52
Avatar
vodslon
Člen
Avatar
Odpovídá na IvoD
vodslon:

Ahoj, nějáký posun? Taky by mě to zajímalo :) , já totiž mám pořád přestavu, že si musím udělat vlastní hromadu třeba textboxů na které musí být nabindované data třeba z DB. Pokud tedy chceme, aby se to měnilo i zpětně.
Chápu tedy, že chceš mít řádek z databáze rozdělenej do jiného grafického rozhraní nebo jak to napsat? Třeba aby Ti řádek vypisoval třeba štítek z adresou a když přepíšeš tu adresu tak se to zapsalo zpět do db?

 
Nahoru Odpovědět 10.10.2014 17:45
Avatar
IvoD
Člen
Avatar
Odpovídá na vodslon
IvoD:

Ahoj, tady na stránce http://msdn.microsoft.com/…ary/aa231248(v=vs.60).aspx hned nahoře je obrázek právě toho "free-form" typu rozložení, které potřebuji realizovat (v tomto případě 4 property nějakého datového objektu jsou na jednom řádku editovatelného seznamu) - tento seznam je v tomto případě realizován pomocí DataRepeateru z Visual Basic PowerPacku, Jan Vargovský (pako) doporučuje udělat si vlastní komponentu pomocí FlowLayoutPanel což taky jde, ale mám pocit, že tohle snad už musel na zeměkouli někdo řešit...
Zatím si ještě píšu na MSDN fóru s nějakým člověkem z MS, uvidíme, co z toho vzejde. Zatím to u mne je bohužel DataRepeater : FlowLayoutPanel tak 50:50, nemám pocit, že něco by bylo jednoznačně lepší, vše má své pro i proti.

 
Nahoru Odpovědět 13.10.2014 10:55
Avatar
IvoD
Člen
Avatar
Odpovídá na vodslon
IvoD:

Ahoj, takže s definitvní platností jsem zrušil DataRepeater z VB PowerPacku a dělám to podle doporučení - udělal jsem si vlastního potomka od FlowlayoutPanel (realizuje zatím jen getter pro BindingSource a handler pro ListChanged toho BindingSource) a do něho strkám UC s free-form rozložením jednotlivých položek. Bindování na příslušný ObjectDataSource provádím vizuálně na tom UC a zatím to takhle funguje.

Takže ještě jednou díky všem.

 
Nahoru Odpovědět 23.10.2014 9:58
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 14 zpráv z 14.