Как передать значения между формами в приложении c # windows?
У меня две формы A и B. Форма A является формой запуска приложения по умолчанию. Я делаю некоторые вещи в форме A и i, тогда я хочу запустить свою форму B параллельно, а затем передать параметр методу в форме B из формы A.
Как ?
- Какая стандартная формулировка говорит нам, что временное продление срока службы ref-to-const только «работает один раз»?
- является f (void), устаревшим в современных C и C ++
- Лучший способ удалить повторяющиеся записи из таблицы данных
- Как сделать scanf для одиночного символа в C
- Когда я использую точку, стрелку или двойную двоеточие, чтобы ссылаться на членов classа на C ++?
- Что происходит, когда переменная выходит за frameworks?
- Разница между возвратом и ожиданием задачи в асинхронном методе
- Проверьте, содержит ли строка строку в C ++
- Наследование C ++ и функция переопределения
- Получение исключения переполнения стека при объявлении большого массива
- Установить службу Windows с помощью командной строки Windows?
- Причина использования ivars против свойств в объекте c
- Функция PInvoke для C, которая возвращает char *
Ян дал некоторый пример кода, но я хотел бы сделать более широкий вывод:
Классы UI – это просто classы.
Как бы вы передали значение от одного объекта другому объекту, если они не были частью пользовательского интерфейса? У вас будет ссылка от одного к другому, и вызовите метод или установите свойство. То же самое верно для объектов пользовательского интерфейса.
Я упоминаю об этом, потому что это что-то очень много. Всякий раз, когда вы спрашиваете себя: «Как мне делать X с формами?» попробуйте задать себе тот же вопрос, но с обычными старыми classами. Часто ответ будет точно таким же.
Конечно, есть некоторые различия в classах пользовательского интерфейса – особенно при streamовой передаче – но для очень многих случаев это действительно помогает, если вы просто думаете о них как о нормальных classах.
FormA должен создать / удержать экземпляр FormB. Очевидно, что метод в FormB должен быть общедоступным, также измените тип объекта, который используется в CallMethodOnFormB, на правильный тип.
public class FormA { private FormB fB; public void CreateFormB() { // This shows the form in parallel. this.fB = new FormB(); this.fB.Show(); } public void CallMethodOnFormB(object value) { this.fB.RunSomeFunction(value); } }
Вы можете использовать шаблон EventAggregator, если вы не хотите связывать свои формы.
Некоторые чтения:
В зависимости от ваших потребностей, другой подход состоял бы в том, чтобы представить глобальный экземпляр classа ( singleton ), который может содержать материал, который должен быть разделен между несколькими формами / classами вашего приложения.
Например, если у вас есть форма, где пользователь может определить свои настройки / предпочтения, вы можете сохранить эти данные в одноэлементном режиме. Все остальные classы и формы вашего приложения могут затем получить / прочитать эти настройки из одного и того же экземпляра singleton.
Вот очень простой пример синглтона:
public class MySettings { // the one and only instace (the singleton): public static readonly MySettings Instance = new MySettings(); private MySettings() {} // private constructor public int SomeNumber { get; set; } public string SomeString { get; set; } }
Теперь вы можете получить доступ к настройкам / получить свойства MySetting из любого другого classа / формы в вашем приложении, например:
в PreferencesForm.cs:
//read the user's input and store it in the settings MySettings.Instance.SomeNumber = txtNumber.Value;
в SomeOtherForm.cs:
//read the user's setting and use it int theNumber = MySettings.Instance.SomeNumber; // do something with theNumber