WPF Come si crea una casella di testo in modo dinamico e trovare la casella di testo in un clic del pulsante?
-
22-08-2019 - |
Domanda
Sto creando un TextBox
e un Button
dinamicamente utilizzando il seguente codice:
Button btnClickMe = new Button();
btnClickMe.Content = "Click Me";
btnClickMe.Name = "btnClickMe";
btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
someStackPanel.Childern.Add(btnClickMe);
TextBox txtNumber = new TextBox();
txtNumber.Name = "txtNumber";
txtNumber.Text = "1776";
someStackPanel.Childern.Add(txtNumber);
collego ad un evento click al pulsante Click Me
. Il pulsante clicca me anche è sparato in modo corretto. Tuttavia non riesco a trovare il TextBox
sono entrato in modo dinamico.
Ecco il mio click me evento:
protected void ClickMeClick(object sender, RoutedEventArgs e)
{
// Find the phone number
TextBox txtNumber = this.someStackPanel.FindName("txtNumber") as TextBox;
if (txtNumber != null)
{
string message = string.Format("The number is {0}", txtNumber.Text);
MessageBox.Show(message);
}
else
{
MessageBox.Show("Textbox is null");
}
}
Come faccio a trovare il TextBox
txtNumber
?
Soluzione
Josh G ha avuto l'indizio che risolto questo codice:. Uso RegisterName ()
Tre vantaggi qui:
- Non fa uso di una variabile membro per salvare il riferimento al TextBox creato in modo dinamico.
- Compila.
-
completo del codice.
using System; using System.Windows; using System.Windows.Controls; namespace AddControlsDynamically { public partial class Window1 : Window { public void Window_Loaded(object sender, RoutedEventArgs e) { GenerateControls(); } public void GenerateControls() { Button btnClickMe = new Button(); btnClickMe.Content = "Click Me"; btnClickMe.Name = "btnClickMe"; btnClickMe.Click += new RoutedEventHandler(this.CallMeClick); someStackPanel.Children.Add(btnClickMe); TextBox txtNumber = new TextBox(); txtNumber.Name = "txtNumber"; txtNumber.Text = "1776"; someStackPanel.Children.Add(txtNumber); someStackPanel.RegisterName(txtNumber.Name, txtNumber); } protected void CallMeClick(object sender, RoutedEventArgs e) { TextBox txtNumber = (TextBox) this.someStackPanel.FindName("txtNumber"); string message = string.Format("The number is {0}", txtNumber.Text); MessageBox.Show(message); } } }
Altri suggerimenti
Un altro metodo è quello di impostare la TextBox
associato come Button Tag
quando instanciating loro.
btnClickMe.Tag = txtNumber;
In questo modo è possibile recuperarlo indietro nel gestore di eventi.
protected void ClickMeClick(object sender, RoutedEventArgs e)
{
Button btnClickMe = sender as Button;
if (btnClickMe != null)
{
TextBox txtNumber = btnClickMe.Tag as TextBox;
// ...
}
}
È possibile ottenere il vostro gestore di clic originale al lavoro registrando il nome della casella di testo:
someStackPanel.RegisterName(txtNumber.Name, txtNumber);
Questo sarà quindi permetterà di chiamare FindName sulla StackPanel e trovare il TextBox.
Se si vuole fare una ricerca completa attraverso la struttura visiva di controlli, è possibile utilizzare la classe VisualTreeHelper.
Utilizzare il seguente codice per scorrere tutti i bambini visive di un controllo:
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parentObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is TextBox)
// Do something
}
Se si desidera effettuare la ricerca verso il basso nell'albero, si vuole eseguire questo ciclo in modo ricorsivo, in questo modo:
public delegate void TextBoxOperation(TextBox box);
public bool SearchChildren(DependencyObject parent, TextBoxOperation op)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
TextBox box = child as TextBox;
if (box != null)
{
op.Invoke(box);
return true;
}
bool found = SearchChildren(child, op);
if (found)
return true;
}
}
C'è un modo è possibile sfruttare al controllo TextBox un campo nella classe invece di una variabile all'interno del vostro metodo di generatore
public class MyWindow : Window
{
private TextBox txtNumber;
public void Window_Loaded()
{
GenerateControls();
}
public void GenerateControls()
{
Button btnClickMe = new Button();
btnClickMe.Content = "Click Me";
btnClickMe.Name = "btnClickMe";
btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
someStackPanel.Childern.Add(btnClickMe);
txtNumber = new TextBox();
txtNumber.Name = "txtNumber";
txtNumber.Text = "1776";
someStackPanel.Childern.Add(txtNumber);
}
protected void ClickMeClick(object sender, RoutedEventArgs e)
{
// Find the phone number
string message = string.Format("The number is {0}", txtNumber.Text);
MessageBox.Show(message);
}
}