Как я могу получить текстовое значение TextBox, имя которого назначается во время выполнения? - PullRequest
2 голосов
/ 18 ноября 2009

Я создаю TextBox со следующим кодом:

TextBox textBox = new TextBox();
textBox.Name = propertyName;
textBox.Text = value;
textBox.Width = FormControlColumnWidth;
textBox.SetResourceReference(Control.StyleProperty, "FormTextBoxStyle");

sp.Children.Add(textBox); //StackPanel
FormBase.Children.Add(sp);

При нажатии кнопки я хочу получить текстовое значение этого текстового поля, но не могу указать его в коде:

string firstName = FirstName.Text;

, поскольку "FirstName" будет определено во время выполнения. Итак, как мне получить текстовое значение Textbox, не зная его имени во время компиляции?

Вот что у меня есть, но он говорит, что не может найти «FirstName», даже если он определен во время выполнения:

private void Button_Save(object sender, RoutedEventArgs e)
{
    using (var db = Datasource.GetContext())
    {
        var item = (from i in db.Customers
                        where i.Id == TheId
                        select i).SingleOrDefault();

        item.FirstName = ((TextBox)FindResource("FirstName")).Text;
        db.SubmitChanges();
    }
}

Воспроизводимый пример:

Я разместил полный воспроизводимый пример этой проблемы здесь: Почему я не могу получить доступ к TextBox по имени с помощью FindName ()? , возможно, проще для анализа.

Ответы [ 5 ]

3 голосов
/ 18 ноября 2009

Вы можете получить его так:

TextBox tb=(TextBox)Children.First(w=>w.Name=="FirstName");

Не уверен, что это sp в вашем коде, но если вам действительно нужен 2-й уровень элементов управления, вы можете запустить цикл foreach над первым уровнем, а затем искать по имени на втором уровне.

3 голосов
/ 18 ноября 2009

Самое простое решение, вероятно, - сохранить ссылку на ваше текстовое поле где-то в вашем коде. Просто добавьте

private TextBox _textbox

в верхней части вашего класса и установите его в TextBox, который вы добавляете в свой код. Затем вы можете обратиться к нему в вашем обработчике событий Button_Save.

2 голосов
/ 18 ноября 2009

Ответ на этот вопрос заключается в том, что вы должны использовать this.RegisterName("FirstName", textBox);, что объясняется здесь: Почему я не могу получить доступ к TextBox по имени с помощью FindName ()?

1 голос
/ 18 ноября 2009

Вы можете найти любой элемент, используя FindName :

 var c = (FrameworkElement)this.FindName("somename");
0 голосов
/ 18 ноября 2009

Я не могу писать комментарии, так что это ответ на ваш комментарий.

Почему бы не использовать

Dictionary<string, TextBox> 

как свойство класса? таким образом, вы можете хранить ссылки на неопределенное количество экземпляров текстовых полей в классе и легко обращаться к ним по имени в словаре?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...