2012-12-29 123 views
4

我有多个XAML TextBox es,其中每个修改TextBox中的值时,使用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并更新其文本?

回答

6

使用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

我建议使用MVVM模式,数据模板,ItemsControl的为了有效处理这个问题。

+2

也许你可以通过一个简短的例子来充实你的答案,以显示你的意思。就目前而言,它有点缺乏有用的细节来帮助解决问题带来的问题。 –

2

有两种方法你可能会去:

如果你有大量的数据来管理,或者如果你不能预测数组的长度,这将是更好地绑定到一个集合,而不是手动将数据插入和移出数组。如果您创建派生自ObservableCollection的类而不是使用数组,那么数据关系就非常简单。

如果您确实需要手动执行此操作,也许最好将索引粘贴到文本框的“标记”字段中。你可以(一)清楚地看到它在你的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"; 
     } 
    } 
1

我会去我介绍了这个问题的答案的方向: form anchor/dock 总之,我想创建保存实际值的类然后创建一个保存信息类的集合。

然后,我不会在文本框上使用事件“TextChanged”,而是在用于保存文本的依赖属性上进行“嗅探”更改。这可以很容易地在依赖属性中完成。

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