Wpf Add handler   zodpovězená otázka

C#, WPF

V predchádzajúcej otázke som potreboval pridať text boxy. Už to funguje. Len teraz by som potreboval vedieť, ako ku každému textBoxu pridať handler trebárs na click.

http://www.dotnetportal.cz/forum/tema/27...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Textbox nemá click, ale šlo by například MouseLeftButtonDown:

private void GenerateTextBox()
{
    var panel = new StackPanel() { Orientation = Orientation.Horizontal };
    var textbox = new TextBox() { Name = "a" + textBoxCislo.ToString(), Text = textBoxCislo.ToString() };
    textbox.MouseLeftButtonDown += Textbox_MouseLeftButtonDown;
    panel.Children.Add(textbox);
    textbox = new TextBox() { Name = "b" + textBoxCislo.ToString(), Text = textBoxCislo.ToString() };
    textbox.MouseLeftButtonDown += Textbox_MouseLeftButtonDown;
    panel.Children.Add(textbox);
    stackPanel1.Children.Add(panel);

    this.textBoxCislo++;
}

private void Textbox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var textbox = (TextBox)sender;
    //...
}
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ďakujem za odpoveď, ale nefunguje.

Na

textbox.MouseLeftButtonDown += Textbox_MouseLeftButtonDown;

mi hlási

Error No overload for 'Textbox_MouseLeftButtonDown' matches delegate 'System.Windows.Input.MouseButtonEventHandler'

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Sorry, napsal jsem tam omylem špatně KeyEventArgs. Opravil jsem předchozí příspěvek. To Vás ale taky mohlo napadnout samotného, že tam samozřejmě patří MouseButtonEventArgs.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Nenapadlo.:-). Ďakujem. Ale aj tak. Doplnil som

private void Textbox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
           var textbox = (TextBox)sender;
            MessageBox.Show(textbox.ToString());
        }

A ak kliknem na jeden zo zobrazených textBoxov, tak nič sa nedeje.

Najväčšia sranda na tom je, že aj tak to musím riešiť inak.

Vedľa zobrazených text boxov su ešte zobrazené tlačítka a po kliknutí na tlačítko by som potreboval tobraziť údaje v príslušných textBoxoch.

Nedarí sa.

Pekný večer prajem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Malo by to vyzerať nejak takto

public partial class MainWindow : Window
    {
      int textBoxCislo =1;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            GenerateTextBox();
        }
        private void GenerateTextBox()
        {
            var panel = new StackPanel() { Orientation = Orientation.Horizontal };
            var textbox = new TextBox() { Name = "a" + textBoxCislo.ToString(), Text = textBoxCislo.ToString() };
            panel.Children.Add(textbox);
            textbox = new TextBox() { Name = "b" + textBoxCislo.ToString(), Text = textBoxCislo.ToString() };
            panel.Children.Add(textbox);
            var btn1 = new Button() { Name = "btn" + textBoxCislo.ToString() };
          btn1.Click +=new RoutedEventHandler(btn1_Click);
            panel.Children.Add(btn1);           
            stackPanel1.Children.Add(panel);
            this.textBoxCislo++;
        }  
        public RoutedEventHandler btn1_Click (object sender, RoutedEventArgs e)        
        { 
            MessageBox.Show(TextBox.text(podľa čísla buttonu));
        }
    }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím jestli je schválně, že tam je to tlačítko jen jedno a ještě bez obsahu ale to je jedno.

Pro vyhledání patřičného TextBoxu můžete například využít to, že jsou s tlačítkem ve stejném StackPanelu (Parent tlačítka).

private void Btn1_Click(object sender, RoutedEventArgs e)
{
    var panel = (DependencyObject)VisualTreeHelper.GetParent((DependencyObject)sender);

    TextBox textBoxA = null;
    TextBox textBoxB = null;
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(panel); i++)
    {
        var element = (FrameworkElement)VisualTreeHelper.GetChild(panel, i);

        if (element.Name.StartsWith("a"))
        {
            textBoxA = (TextBox)element;
        }
        if (element.Name.StartsWith("b") && !element.Name.StartsWith("btn"))
        {
            textBoxB = (TextBox)element;
        }
    }

    MessageBox.Show(textBoxA.Text + " " + textBoxB.Text);
}

A příště označujte kód v příspěvcích ikonou kód C#, ať je to alespoň trochu čitelné.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pán Holan, ďakujem a ospravedlňujem sa Vám, ale asi si nerozumiemie. Tých tlačidiel je toľko ako textBoxov v jednom stĺpci.

Malo by to vyzerať takto

 public partial class MainWindow : Window
    {
      int textBoxCislo =1;
    
        public MainWindow()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            GenerateTextBox();
        }
        private void GenerateTextBox()
        {
            var panel = new StackPanel() { Orientation = Orientation.Horizontal };
            var textbox = new TextBox() { Name = "a" + textBoxCislo.ToString(), Text = textBoxCislo.ToString(), Width = 20 };
            panel.Children.Add(textbox);
            textbox = new TextBox() { Name = "b" + textBoxCislo.ToString(), Text = textBoxCislo.ToString(), Width = 20 };
            panel.Children.Add(textbox);
            var btnX = new Button() { Name = "btn" + textBoxCislo.ToString(), Tag= textBoxCislo.ToString() };
        btnX.Click +=btnX_Click;
           panel.Children.Add(btnX);           
            stackPanel1.Children.Add(panel);
            this.textBoxCislo++;
        }
        public RoutedEventHandler btnX_Click { get; set; '''a tu potrebujem aby kliknutý button zobazil svoj napríklad Tag. MessageBox.Show(ButtonTag)''' }
    }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

MessageBox.Show((string)((Button)sender).Tag)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to super, ale problem je v tom, že

 public RoutedEventHandler btnX_Click 
        { MessageBox.Show((string)((Button)sender).Tag) }

nefunguje.

A get or set accessor expected.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A na "public RoutedEventHandler btnX_Click" jste přišel jak?

Vždyť to samo studio doplňuje při psaní registrace události, tak jak to můžete mít špatně (a ještě pokaždé jinak, trochu jsem se divil co tam dělá ten get; set; v předchozím příspěvku).

Asi po 150té tedy má být:

private void BtnX_Click(object sender, RoutedEventArgs e)

Asi byste si měl naštudoval věci jako event, delegat, EventHandler, generický EventHandler, EventArgs, vytvořit si vlastní EventArgs, atd.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Hurá!Funguje.Ďakujem.

public RoutedEventHandler btnX_Click mi ponúkalo studio vrátene get a set.

Ešte raz ďakujem a prajem príjemný večer.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pán Holan, tu ste mi odpovedali na otázku, ktorú som chcel ešte len položiť. Super!

Ďakujem a prajem pekné vianočné sviatky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback