动态设置TextBox文本

时间:2012-12-29 02:58:43

标签: c# wpf xaml textbox

我有多个XAML TextBox es,当TextBox中的值发生变化时,每个XAML C#使用动态检查的TextBox方法来操作数组中的相应值 <TextBox x:Name="_0_0" TextChanged="_x_y_TextChanged"/> <TextBox x:Name="_0_1" TextChanged="_x_y_TextChanged"/> <TextBox x:Name="_0_2" TextChanged="_x_y_TextChanged"/> // And so on..... 调用了该方法。

TextBox

TextBox中的值被更改时,每个操作数组中的相应值,使用C#方法动态检查哪个 private void _x_y_TextChanged(object sender, TextChangedEventArgs e) { TextBox current = (TextBox)sender; string currentname = current.Name; string rowstring = currentname.Substring(1, 1); string columnstring = currentname.Substring(3, 1); int row = Convert.ToInt32(rowstring); int column = Convert.ToInt32(columnstring); // I've then detected the name of the textbox which has called it... 已调用该方法。

TextBox

因此,此信息可用于动态存储来自TextBox的相应数组索引中的信息 - 或者您想用它做什么......

我的问题是:

如何创建一个在数组中使用索引位置的方法,调用相关的{{1}}并更新其文本?

4 个答案:

答案 0 :(得分:7)

使用FindName(string)按名称查找文本框,如下所示(其中container是包含所有文本框的控件):

private void UpdateTextBox(int row, int column, string text)
{
    TextBox textBox = container.FindName("_" + row + "_" + column) as TextBox;
    if(textbox != null)
    {
        textbox.Text = text;
    }
}

答案 1 :(得分:2)

您可以采用两种方式:

如果要管理大量数据,或者无法预测数组的长度,最好绑定到集合,而不是手动将数据导入和导出数组。如果您创建一个派生自ObservableCollection的类而不是使用数组,那么数据&lt;&gt;你的关系非常简单。

如果您确实需要手动执行此操作,可能最好将索引粘贴到文本框的“标记”字段中。您可以(a)在您的xaml中清楚地看到它,(b)轻松解析它,(c)如果您在此处使用了公式的变体:

Find all controls in WPF Window by type

您可以在窗口中迭代文本框,并通过查看其标记索引找到正确的文本框:

    foreach (TextBox t in FindVisualChildren<TextBox>(this))
    {
        if ((int) t.Tag)  == my_index )
        {
            t.Text = "my_text_goes_here";
         }
    }

答案 2 :(得分:1)

我建议使用MVVM模式,数据模板和ItemsControl来有效地处理这个问题。

答案 3 :(得分:1)

我会朝着这个问题的答案方向前进: form anchor/dock 简而言之,我将创建一个包含实际值的类,然后创建一个包含信息类的集合。

然后我不会在TextBoxes上使用事件“TextChanged”,而是“嗅探”用于保存文本的Dependency属性的更改。这可以在Dependency Property中轻松完成。

最后,我会使用ItemsControl或ItemsPresenter来显示控件。控件数量将遵循集合中的项目数。