如何使用另一个类的方法更改标签号和文本?

时间:2017-05-29 09:15:48

标签: c# class methods label

我的Form1上有不同的标签,并希望使用相同的方法更改单个标签的文本。

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

    private void button1_Click(object sender, EventArgs e)
    {
        Class1 change = new Class1();
        change.ChangeLabelText();
    }

    public void ChangeLabel(string msg, Label label)
    {
        if (label.InvokeRequired)
            label.Invoke(new MethodInvoker(delegate { label.Text = msg; }));
        else
            label.Text = msg;
    }
}

如何根据需要传递label1或label2?

class Class1
{
    public void ChangeLabelText()
    {
        Form1 frm1 = new Form1();
        frm1.ChangeLabel("Surname", label2);           
    }
}

label2带有红色下划线:不存在于实际比赛中

4 个答案:

答案 0 :(得分:2)

我不知道您尝试更改标签的上下文是什么...但是我有一些观察您的示例代码的观察结果。

首先,对于您的问题,其中一种方法可以如下,

private void button1_Click(object sender, EventArgs e)
{
    Class1 change = new Class1(this);
    change.ChangeLabelText();
}

public void ChangeLabel(string msg, Label label)
{
    if (label.InvokeRequired)
        label.Invoke(new MethodInvoker(delegate { label.Text = msg; }));
    else
        label.Text = msg;
}

// dont allow UI elements to be accessed directly from outide
public string Fullname
{
    get
    {
        return label1.Text;
    }
    set
    {
        label1.Text = value;
    }
}

// dont allow UI elements to be accessed directly from outide
public string Surname
{
    get
    {
        return label2.Text;
    }
    set
    {
        label2.Text = value;
    }
}

您看到Class1的对象引用了Form1。 在Class1.ChangeLabelText中,您可以执行以下操作,

class Class1
{
    Form1 _mainForm;
    public Class1(Form1 form)
    {
        _mainForm = form;    
    }
    public void ChangeLabelText()
    {
        //Form1 frm1 = new Form1();
        //frm1.ChangeLabel("Surname", label2);
        _mainForm.Surname = "Surname";
    }
}

看到样品后的观察

  1. 最好不要公开/允许非所有者访问UI元素(在这种情况下,Form1是所有者)
  2. 在button1_Click中,您已经在Form1实例(对象)中,但是在ChangeLabelText中,您正在尝试创建另一个Form1实例。
  3. 希望这会对你有所帮助。

答案 1 :(得分:1)

您需要将label作为参数传递给方法

class Class1
{
public void ChangeLabelText(Label lbl)
    {
    Form1 frm1 = new Form1();
    frm1.ChangeLabel("Surname", lbl);
    }
}

点击按钮 -

change.ChangeLabelText(label2);

答案 2 :(得分:1)

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

    private void button1_Click(object sender, EventArgs e)
    {
        Class1 change = new Class1();
        change.ChangeLabelText(this);
    }

    public void ChangeLabel(string msg, Label label)
    {
        if (label.InvokeRequired)
            label.Invoke(new MethodInvoker(delegate { label.Text = msg; }));
        else
            label.Text = msg;
    }
}

class Class1
{
    public void ChangeLabelText(System.Windows.Forms.Form form)
    {
        if(form != null)
        {
            var labelIdWhoseTextNeedsToChange = "label2"; // Or any dynamic logic to determine which label will have to be updated.
            var labelControl = form.Controls.Find(labelIdWhoseTextNeedsToChange, false);
            if(labelControl != null)
            {
                form.ChangeLabel("Surname", labelControl);
            }
        }
    }
}

答案 3 :(得分:1)

另一种方法是让Class1使用Label的名称和String来引发 Event 以将其更改为。您的表格将收到活动,找到标签本身,并更新价值。这样,Class1永远不需要对Form1或任何标签的引用。它仍然是一个糟糕的设计,因为你需要知道标签的名称,但这是你走的方向。

以下是Class1的样子:

public class Class1
{

    public delegate void dlgChangeLabel(string lblName, string newValue);
    public event dlgChangeLabel ChangeLabel;

    public void ChangeLabelText()
    {
        if (ChangeLabel != null)
        {
            ChangeLabel("label2", "SurName");
        }
    }

}

回到Form1,我们需要在创建Class1实例时订阅ChangeLabel()事件:

public partial class Form1 : Form
{

    private void button1_Click(object sender, EventArgs e)
    {
        Class1 change = new Class1();
        change.ChangeLabel += Change_ChangeLabel;
        change.ChangeLabelText();
    }

    private void Change_ChangeLabel(string lblName, string newValue)
    {
        // see if we have a Label with the desired name:
        Control[] matches = this.Controls.Find(lblName, true);
        if (matches.Length > 0 && matches[0] is Label)
        {
            Label lbl = (Label)matches[0];
            ChangeLabel(newValue, lbl); // update it in a thread safe way
        }
    }

    private void ChangeLabel(string msg, Label label)
    {
        if (label.InvokeRequired)
            label.Invoke(new MethodInvoker(delegate { label.Text = msg; }));
        else
            label.Text = msg;
    }

}

替代版本显示了在Form Load()期间创建Class1并将其事件连接起来,因此它没有附加到Button处理程序:

public partial class Form1 : Form
{

    private Class1 change = new Class1();

    private void Form1_Load(object sender, EventArgs e)
    {
        change.ChangeLabel += Change_ChangeLabel;
    }

    private void Change_ChangeLabel(string lblName, string newValue)
    {
        Control[] matches = this.Controls.Find(lblName, true);
        if (matches.Length > 0 && matches[0] is Label)
        {
            Label lbl = (Label)matches[0];
            ChangeLabel(newValue, lbl);
        }
    }

    private void ChangeLabel(string msg, Label label)
    {
        if (label.InvokeRequired)
            label.Invoke(new MethodInvoker(delegate { label.Text = msg; }));
        else
            label.Text = msg;
    }

}

现在你只需要在Class1中以某种方式引发事件。在你提出之前,确保它有一个订阅者(不是空):

// in Class1
private void Foo()
{
    if (ChangeLabel != null)
    {
        ChangeLabel("label2", "SurName");
    }
}