Diskuze: Dynamicky přidání comboboxu ve WPF
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 18 zpráv z 18.
//= 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.
addLoad.SetValue(Canvas.LeftProperty, /*třeba*/10);
//nebo
Canvas.SetLeft(addLoad, 10);
A nefunguje ti to protože
A proč používáš <code>Canvas</code>?
Ahoj,
proč Canvas to nevím, už jsem nevěděl co, tak jsem prostě googlil. Jestli je nějaký lepší způsob, tak prosím jaký?
A prosím tě, neporadil by jsi jak s tou třídou? V té mé jsem zkoušel dědit přímo z Window a k LayoutRoot jsem šel skrze Instanci Steel. Ale stejně mi to nefunguje. A předpokládám, že když mi to přídní bxu funguje ve třídě steel, která dědí z Windo, tak nechápu proč mi to nejde z jiné třídy.
Jednodušší by měl být <code>Grid</code>. Sice se musíš pohrát s věcmi jako <code>WrapPanel</code>, ale není to žádný problém.
comboBoxesWrapPanel.Children.Add(addLoad);
apod.
Třídu bych prostě neřešil, já to vždycky nechávám ve <code>Window</code>
No já nevím jestli to nějak vyřeší můj problém. Protože prostě nevím, jak přidávat souřadnice těm boxům. Šlo použít .Location, ale to ne WPF mi nejde. Jednoduše si představuju, že budu mít nějakou pozici a pak udělám něco jako i+=30. atd... Ale to asi nejde.
Ještě obrázek.
Jestli to chceš těsně vedle sebe (nebo s mezerou – na to použij <code>Margin</code>), prostě to hoď do WrapPanelu kódem výš. Jinak přes Row a Column.
Achjo, já se z toho ITN zblázním. První zapomenu přihodit obrázek, potom už to nejde a když teda na to chci odpovědět, radši se to edituje.
Nakonec jsem to nechal přes ten Canvas
Canvas.SetTop(addLoad, x);
x+=40;
A přes button tam naklikám i 100 comboboxů. Ale teď zase nevím jak
získat jednotlivé indexy .
nevím jak přijít, jak se ty comboboxy jmenují. K tomu jendomu comboxu jsem
vytvořil:
private void ComboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int index = ComboBox1.SelectedIndex;
TextBoxSelec.Text = index.ToString();
}
Ale reaguje to jen čistě na ten jeden combobox, který mám uvedený v
Canvas. Na ty další ne. Nevíš prosím, jak toto vyřešit?
Ve finále budu ke každému combboxu tvořit i textbox, které budou na sobě
závislé, ale tedy nerozumím tomu, jak se k nim dostat.
XAML si udělej sám. A bez ComboBoxu a s WrapPanelem(teda doporučuju).
private void ButtonAddLoad_Click(object sender, RoutedEventArgs e)
{
ComboBox addLoad = new ComboBox();
addLoad.Width = 250;
addLoad.Height = 30;
ComboBoxItem addLoad_Item1 = new ComboBoxItem();
addLoad_Item1.Content = "Force";
addLoad.Items.Add(addLoad_Item1);
ComboBoxItem addLoad_Item2 = new ComboBoxItem();
addLoad_Item2.Content = "Line Force";
addLoad.Items.Add(addLoad_Item2);
//odted jsou zmeny
addLoad.Margin = new Thickness(5, 0, 5, 0);
addLoad.SelectionChanged += ComboBox_SelectionChanged();
addLoad.SelectionChanged += ComboBox_SelectionChanged;
TextBox tb = new TextBox();
CBsWP.Children.Add(addLoad);
TBsWP.Children.Add(tb);
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int index = (sender as ComboBox).SelectedIndex;
int tbIndex = WP.Children.IndexOf(sender);
(TBWP.Children[tbIndex] as TextBox).Text = index.ToString();
}
Ještě se s tím trochu pohraj, tohle bylo jen aby ti to vůbec nějak
fungovalo. Tak např. nechápu, proč mi to vždycky napsalo "1" Ještě zkusím pořešit.
Aha, tak bys to měl mít v pořádku. Zkoušel jsem to na trochu jiném
kódu.
A klidně to můžeš umístit jen do jednoho WP. To pak vyřešíš tak, že Btn je mimo a TB a CB rozeznáš podle <code>index % 2</code>
Díky moc. Pokusil jsem se zprovoznit to co jsi psal výše.
addLoad.SelectionChanged += ComboBox_SelectionChanged();
Proč to máš 2x pod sebou, bez argumentu mi to nefunguje (Není dán žádný
argument ......)
2)
int tbindex = TBsWP.Children.IndexOf(sender);
Tady mi to píše, že nemůžu převést object na
System.Windows.UIElement
tomu teda moc nerozumím :-/
No já tu pořád něco zkouším sám, ale mocmi to nefunguje . Obojí jsem si myslel, ale když
tam mám sender as Textbox, tak na poslední řádku mi to píše, že jsem mimo
rozsah platných hodnot.
Zkusil jsem
TextBoxSelec.Text = index.ToString();
a reaguje to na každý nový combobox, takže jen vyřešit to plnění
nového texboxu.
Druhá metoda mého kódu, ale na konec druhého řádku dej místo <code>sender</code> <code>sender as ComboBox</code>
Ano, místo as TexBox, tam chtělo dát ComboBox a ještě to chtělo brát Index z CBsWP, ty jsi tady měl jen WP a já tam zkoušel jen TBsWP. Děkuji moc, už to funguje.
Takže funkční kod, díky moc Andy Scheuchzer:
private void ButtonAddLoad_Click(object sender, RoutedEventArgs e)
{
ComboBox addLoad = new ComboBox();
addLoad.Width = 250;
addLoad.Height = 30;
ComboBoxItem addLoad_Item1 = new ComboBoxItem();
addLoad_Item1.Content = "Force";
addLoad.Items.Add(addLoad_Item1);
ComboBoxItem addLoad_Item2 = new ComboBoxItem();
addLoad_Item2.Content = "Line Force";
addLoad.Items.Add(addLoad_Item2);
addLoad.Margin = new Thickness(5, 0, 5, 0);
addLoad.SelectionChanged += ComboBox_SelectionChanged;
TextBox tb = new TextBox();
tb.Width = 100;
tb.Height = 30;
CBsWP.Children.Add(addLoad);
TBsWP.Children.Add(tb);
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int index = (sender as ComboBox).SelectedIndex;
int tbindex = CBsWP.Children.IndexOf(sender as ComboBox);
(TBsWP.Children[tbindex] as TextBox).Text = index.ToString();
}
Sorry, že tak pozdě, ale snad to nevadí. Pokud opravdu chceš dělat tyhle věci z jiné třídy, předej v parametrech <code>StackPanel</code>, <code>ComboBox</code> nebo <code>TextBox</code>.
Zobrazeno 18 zpráv z 18.