Свяжитесь между двумя формами окон в C#

Также имейте в виду, что.NET имеет две "кучи", один являющийся "кучей" для больших объектов. Я полагаю, что объекты примерно 85k или больше помещаются на эту "кучу". Эта "куча" имеет различное время жизни правила, чем регулярная "куча".

при создании структур памяти большой емкости (Словарь или Список) это было бы благоразумный пойти поиск, каковы точные правила.

До исправления памяти после завершения процесса, если Ваше выполнение Win98 или это эквиваленты, все не выпущено назад к ОС после завершения. Единственными исключениями являются вещи, которые открыты межпроцессные, и другой процесс все еще имеет открытый ресурс.

COM-объекты могут быть хитрым tho. Если Вы всегда будете использовать IDispose шаблон, Вы будете в безопасности. Но я натыкался на несколько interop блоков та реализация IDispose. Ключ здесь должен звонить Marshal.ReleaseCOMObject, когда Вы сделаны с ним. COM-объекты все еще используют стандартный подсчет ссылок COM.

38
задан Servy 16 November 2016 в 18:52
поделиться

9 ответов

Форма 1 запускает открытие формы 2. Form2 имеет перегруженный конструктор, который принимает вызывающую форму в качестве аргумента и предоставляет ссылку на члены Form2. Это решает проблему связи. Например, я выставил свойство Label как общедоступное в Form1, которое изменено в Form2.

При таком подходе вы можете осуществлять обмен данными по-разному.

Ссылка для загрузки для образца проекта

// Your Form1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2(this);
        frm.Show();
    }

    public string LabelText
    {
        get { return Lbl.Text; }
        set { Lbl.Text = value; }
    }
}

// Ваша форма2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private Form1 mainForm = null;
    public Form2(Form callingForm)
    {
        mainForm = callingForm as Form1; 
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.mainForm.LabelText = txtMessage.Text;
    }
}

alt text
(источник: ruchitsurati.net )

alt text
(источник: ruchitsurati.net )

57
ответ дан 27 November 2019 в 03:24
поделиться

Создайте класс и поместите все свои свойства в класс .. Создайте свойство в родительском классе и установите его из формы дочернего (параметры)

1
ответ дан 27 November 2019 в 03:24
поделиться

Вы можете иметь функцию в форме B следующим образом:

public SettingsResults GetNewSettings()
{
    if(this.ShowDialog() == DialogResult.Ok)
    {
         return new SettingsResult { ... };
    }
    else
    {
         return null;
    }
}

И вы можете называть ее так:

...
using(var fb = new FormB())
{
    var s = fb.GetNewSettings();
    ...
    // Notify other parts of the application that settings have changed.
}
1
ответ дан 27 November 2019 в 03:24
поделиться

MVC, MVP, MVVM - небольшое излишество для кого-то по общему признанию говоря, что им нужны учебные пособия. Это теории, которым посвящены целые курсы.

Как уже писалось, передать объект, вероятно, проще всего. Если отношение к классу как к объекту (взаимозаменяемому в этом смысле) является новым, то вы можете потратить еще 2-4 недели на выяснение свойств, конструкторов и прочего.

Я ни в коем случае не являюсь мастером C #, но эти концепции должны быть довольно конкретными, если вы хотите выйти далеко за рамки передачи значений между двумя формами (также как классы / объекты сами по себе). Совсем не пытаюсь быть злым, это просто похоже на тебя '' Мы переходим от чего-то вроде VB6 (или любого языка с глобальными переменными) к чему-то гораздо более структурированному.

В конце концов, щелкнет.

1
ответ дан 27 November 2019 в 03:24
поделиться

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

Пример VB.NET, но вы поймете идею -

In ваш класс OptionsForm:

Public Option1 as String = ""

и т. д. Установите их, когда они нажмут кнопку «ОК».

Итак, в вашей основной форме

0
ответ дан 27 November 2019 в 03:24
поделиться

Это, вероятно, немного обходит вашу проблему, но в моем диалоге настроек используется конструкция Application Settings. http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

Я не могу найти хороший пример, похожий на то, как я это делаю (который на самом деле имеет реальный класс + объект ), но здесь рассматривается другой способ сделать это:

Чтение настроек приложения по умолчанию в C #

0
ответ дан 27 November 2019 в 03:24
поделиться

В этом случае лучше всего иметь некоторый класс / интерфейс OptionsService , доступный через IServiceProvider .

Просто добавьте событие, когда что-то изменится, и остальная часть приложения сможет на это отреагировать.

6
ответ дан 27 November 2019 в 03:24
поделиться

Свойства - это один вариант, общий статический класс - другой вариант, события - другой вариант ...

1
ответ дан 27 November 2019 в 03:24
поделиться

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

1
ответ дан 27 November 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: