c# - WPF मैं गतिशील रूप से एक टेक्स्टबॉक्स कैसे बनाऊं और एक बटन पर क्लिक करने पर टेक्स्टबॉक्स ढूंढूं?




.net textbox (4)

मैं निम्नलिखित कोड का उपयोग करके गतिशील रूप से TextBox और एक Button निर्माण कर रहा हूं:

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);

मैं Click Me बटन पर Click Me करें। मुझे क्लिक करें बटन भी ठीक से निकाल दिया गया है हालांकि मुझे TextBox मैं गतिशील रूप से दर्ज नहीं मिल सकता है

यहाँ मेरा क्लिक करें मुझे ईवेंट है:

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");
    }
}

मैं TextBox txtNumber कैसे पा सकता हूँ?


एक और तरीका उनको instanciating जब Button Tag रूप में जुड़े TextBox सेट करने के लिए है

btnClickMe.Tag = txtNumber;

इस तरह आप ईवेंट हैंडलर में इसे वापस प्राप्त कर सकते हैं।

protected void ClickMeClick(object sender, RoutedEventArgs e)
{
    Button btnClickMe = sender as Button;
    if (btnClickMe != null)
    {
        TextBox txtNumber = btnClickMe.Tag as TextBox;
        // ...
    }
}

क्या कोई तरीका है जिससे आप टेक्स्टबॉक्स को अपनी कक्षा में एक क्षेत्र को अपने जनरेटर विधि के अंदर एक चर के बजाय नियंत्रण कर सकते हैं?

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);
    }
}

टेक्स्ट बॉक्स के नाम को दर्ज करके आप अपने मूल क्लिक हैंडलर को काम कर सकते हैं:

someStackPanel.RegisterName(txtNumber.Name, txtNumber);

इसके बाद आप स्टैपपैनेल पर FindName को कॉल करने और टेक्स्टबॉक्स ढूंढने की अनुमति देंगे।


यदि आप नियंत्रण के दृश्य ट्री के माध्यम से एक व्यापक खोज करना चाहते हैं, तो आप VisualTreeHelper वर्ग का उपयोग कर सकते हैं।

एक नियंत्रण के सभी दृश्य बच्चों के माध्यम से दोबारा करने के लिए निम्न कोड का उपयोग करें:

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parentObj); i++)
{
    DependencyObject child = VisualTreeHelper.GetChild(parent, i);

    if (child is TextBox)
        // Do something
}

यदि आप पेड़ में नीचे खोजना चाहते हैं, तो आप इस पाश को लगातार पुनरावर्तन करना चाहते हैं, जैसे:

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;
    }
}




mouseevent