2012-12-29 166 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來顯示控件。控件的數量將跟隨集合中的項目數量。