c#如何从另一个类更改变量

时间:2017-09-04 10:09:29

标签: c# class

我有一种名为'语言'在我的Windows窗体应用程序的主要形式。

在子表单中,我有一个组合框,我需要用它来更改'语言' 没有制作主要表单的新实例

namespace MMI_WFA
{
    public partial class MainWindow : Form
    {
        int language;
            ...
            ...
    }
}


namespace MMI_WFA
{
    public partial class MENU : Form
    {
    ...

        private void cbo_Language_SelectedIndexChanged(object sender, EventArgs e)
        {
            function_to_Change_language_in_mainForm();
        }
    }
}

那么我可以使用其他形式的事件更改主窗体中的变量吗?

编辑:我改变了这一点,但this.window中的窗口有红色下划线。

public MENU(MainWindow window) // main constructor
        {
            this.window = window;
            InitializeComponent();
            cbo_SerialPort.Items.AddRange(ports);
            //cbo_SerialPort.SelectedIndex = 2;           

            cbo_Baudrate.Items.AddRange(baudrates);
            //cbo_Baudrate.SelectedIndex = 1;

            cbo_ParityBits.Items.AddRange(partitybits);
            //cbo_ParityBits.SelectedIndex = 0;

            hideExtraSettings();
            fillLanguageBox();
            indexComboboxes();
        }

3 个答案:

答案 0 :(得分:1)

您需要将MainWindow的引用传递给其他类才能访问其成员。要实现此目的,请在MENU - 类中创建一个构造函数,该构造函数需要MainWindow - 类的实例。此外,您要更改的成员应为public,最好是属性而不是字段:

namespace MMI_WFA
{
    public partial class MainWindow : Form
    {
        public int Language { get; set; }
        ...
        ...
    }

    public partial class MENU : Form
    {
        private readonly MainWindow window;

        public MENU(MainWindow window) { this.window = window; }

        private void cbo_Language_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.window.Language = //
        }
    }
}

答案 1 :(得分:0)

好吧,如果您的Menu - 表单没有主表单的实例(您可以在构造函数中传递或作为属性),您仍然可以使用此OpenForms.OfType<MainWindow>获取它 - &#34;特技&#34;:

var main = Application.OpenForms.OfType<MainWindow>().First();
main.Language = 1;

您需要将其设为公共财产:

public partial class MainWindow : Form
{
    public int Language { get; set; }
}

答案 2 :(得分:0)

我准备了一个非常小的例子,你如何从子表单中检索一些东西,而不将主表单传递给子表单

运行主表单

void Main()
{
    var main = new MainForm();
    main.ShowDialog();
}

仅包含1个按钮的主要表单 - 向儿童表单询问数字

class MainForm : Form
{
    public MainForm()
    {
        var button = new Button();
        button.Click += button_pressed;
        button.Text = "Ask number";     
        this.Controls.Add(button);      
    }

    void button_pressed(object sender, EventArgs e)
    {
        var child = new SubForm();
        var result = child.ShowDialog();

        if (result == DialogResult.OK)
        {
            MessageBox.Show($"Entered number is {child.SelectedNumber}");
        }
    }
}

子表格会要求用户输入号码。如果用户输入数字,则表单将以OK对话框结果关闭。对话结果将帮助我们了解用户是选择了某些内容还是只是关闭了表单。

class SubForm : Form
{
    public int SelectedNumber { get; set;}

    public SubForm()
    {
        var button = new Button();      
        var textBox = new TextBox();

        button.Click += (s, e) => {
            int i;
            if (int.TryParse(textBox.Text, out i))
            {
                this.SelectedNumber = i;
                this.DialogResult = DialogResult.OK;
                this.Close();
            }
            else
            {
                MessageBox.Show("pls, enter number", "Warning",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

        };  

        textBox.SetBounds(0, 0, 100, 20);
        button.SetBounds(100, 0, 30, 20);

        button.Text = "OK";     
        this.Controls.Add(textBox);
        this.Controls.Add(button);
    }   
}