Member 10731098 Ответов: 3

Придание значения текстовому полю из другой формы не работает


Я пытался сделать следующее несколькими способами, но это просто не работает.

У меня есть форма с текстовым полем и пользовательским элементом управления, из пользовательского элемента управления мне нужно иметь возможность изменять текст текстового поля.



Кажется, что бы я ни делал, это песочница или что-то в этом роде? потому что, когда я устанавливаю значение строки из другой формы и получаю его сразу же после этого в той же функции, она показывает правильное значение, но когда я пытаюсь получить это значение где-то еще немного позже, это пустая строка..

Что я уже пробовал:

// At User Control:
Form form = new Form();
form.Textbox.Text = "sample text";

Результат = ничего не происходит.


// At Form:
public string test
{
	set { Textbox.Text = value; }
}

// At User Control:
Form form = new Form();
form.test = "sample text";

Результат = ничего не происходит.


// At Form:
public string test1;

public test2
{
	Textbox.Text = test1;
}

// At User Control:
Form form = new Form();
form.test1 = "sample text";
form.test2();

Результат = ничего не происходит.

3 Ответов

Рейтинг:
5

Member 10731098

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

* Я открыл "Form.Designer.cs"
* Я искал фактическое текстовое поле и замененный;

private System.Windows.Forms.TextBox ExampleTextbox;
TO:
public static System.Windows.Forms.TextBox ExampleTextbox;


Затем, в том же файле, уберите "это." перед каждым значением где бы вы его ни увидели:
this.ExampleTextbox.ExampleProperty = Example;
TO:
ExampleTextbox.ExampleProperty = Example;


Затем я мог бы просто вызвать текстовое поле из любой формы или пользовательского элемента управления, например:

Form.Textbox.Text = "Sample text."


Единственным недостатком этого является то, что если вы когда-либо измените какое-либо свойство этой формы с помощью редактора свойств Visual Studio (поэтому не с помощью программирования), все это изменится обратно, и вам придется его переделать.


Так что если есть какой-то лучший способ сделать это, я хотел бы его увидеть!


Richard Deeming

Действительно плохая идея. Если вы когда-нибудь создадите более одного экземпляра своей формы, все они в конечном итоге попытаются поделиться одним и тем же TextBox пример.

Member 10731098

Не могли бы вы показать мне, как это делается профессионально?

Richard Deeming

См. решение 3. :)

Рейтинг:
2

ZurdoDev

Вы просто создаете экземпляры класса Form. На самом деле вам нужно показать форму, чтобы увидеть изменения.


Member 10731098

Хотя это работает, это не решение, я не хочу показывать форму, потому что она уже показана, и это основная форма, пользовательский элемент управления закреплен внутри формы.

ZurdoDev

Затем вам нужно получить дескриптор этой формы, а не запускать новый экземпляр класса. Итак, где бы вы ни открыли форму, сохраните ее в переменной и используйте ее.

Рейтинг:
0

Richard Deeming

Пользовательский элемент управления не должен знать о своем родителе. Вместо этого он должен вызвать событие, когда он хочет изменить текст. Затем родительская форма может подписаться на это событие и обновить текстовое поле по мере необходимости.

Аргументы события :
Польза EventArgs класс для передачи любого значения через событие. Вам нужно только объявить его один раз. Кроме того, заводской метод для упрощения его создания.

public class DataEventArgs<T> : EventArgs
{
    public DataEventArgs(T value)
    {
        Value = value;
    }
    
    public T Value { get; }
}

public static class DataEventArgs
{
    public static DataEventArgs<T> Create<T>(T value)
    {
        return new DataEventArgs<T>(value);
    }
}
Пользовательский элемент управления:
Добавить а TextChanged (или любое другое имя, которое вы хотите) событие, и поднимите его, когда вы хотите изменить текст родительской формы.
[field:NonSerialized]
public event EventHandler<DataEventArgs<string>> TextChanged;

private void OnTextChanged(string newText)
{
    var handler = TextChanged;
    if (handler != null)
    {
        handler(this, DataEventArgs.Create(newText));
    }
}

...

// Raise the event to change the text:
OnTextChanged("sample text");
Форма:
Откройте конструктор, щелкните элемент управления пользователя, перейдите на вкладку "события" в окне свойств и дважды щелкните событие "TextChanged".
protected void UserControl1_TextChanged(object sender, DataEventArgs<string> e)
{
    Textbox.Text = e.Value;
}