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

Člen

Zobrazeno 14 zpráv z 14.
//= 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.
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í...
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.
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?
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 ...
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ý", "[email protected]"));
ListOsob.Add(new osoba("Jan", "Honzík", "[email protected]"));
ListOsob.Add(new osoba("Pepa", "Kolík", "[email protected]"));
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;
}
}
Udělej si usercontrol, který bude reprezentovat tu osobu a pak to narvi tu celou kolekci do FlowLayoutPanelu.
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.
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?
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.
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]
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?
Ahoj, tady na stránce http://msdn.microsoft.com/…=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.
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.
Zobrazeno 14 zpráv z 14.