winforms 通过其他类的方法更改按钮的属性

7y4bm7vi  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(140)

也许你能帮我解决问题。
我的类“Form 1”调用方法setButtons();
但是setButtons()不在类“Form 1”中,它在类“Class 1”中。
“Class 1”中的setButtons()无法识别Form 1中的Button 1。
如何让它知道Form 1中存在Button 1,并且我希望该方法对“Form 1”中的Button 1起作用?Class 1已经有一个指向Form 1的using目录,而Form 1也有一个指向Class 1的using目录。

//this does not work
public static void setbuttons()
{
    Form1.Button1.Location = new Point(40, 40);
}
zhte4eai

zhte4eai1#

我发现如果在设计器文件中声明一个控件为public,如下所示

public Button button1;

然后,您可以从另一个类访问它,条件是您获得了表单对象,例如作为扩展

static class AnotherClass
{
    public static void setButtons(this Form1 form)
    {
        form.button1.Text = "Hello";
    }
}

从设计和程式码管理的Angular 来看,变更按钮属性的较佳方式是在表单中建立执行此作业的方法。

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

    private void Form1_Load(object sender, EventArgs e)
    {
        ...
    }

    public void ChangeButtonTextMethod(string text)
    {
        button1.Text = text;
    }
}
yeotifhr

yeotifhr2#

请考虑使用事件,其中Class1中的方法会将Point传递至接听事件的呼叫表单,在本例中为SetButtons。

public class Class1
{
    public delegate void OnSetLocation(Point point);
    public static event OnSetLocation SetButtonLocation;

    public static void SetButtons()
    {
        SetButtonLocation!(new Point(40, 40));
    }
}

在订阅SetButtonLocation的表单中,叫用SetButtons方法,此方法会将Point传递给Form1中的呼叫者,并依序设定按钮Location。

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

    private void button1_Click(object sender, EventArgs e)
    {
        Class1.SetButtonLocation += OnSetButtonLocation;
        Class1.SetButtons();
        Class1.SetButtonLocation -= OnSetButtonLocation;
    }

    private void OnSetButtonLocation(Point point)
    {
        button1.Location = point;
    }
}

使用这种方法比前面提到的将form的modifers更改为public要好。

相关问题