2016-07-06 33 views
-2

的方法我有一个主窗体(称为Form1),其中有一个标签(称为lbl1)。调用并传递给类

除此之外我也有看起来像这样的方法:

public void SetLabelText(string lblText) 
{ 
    lbl1.Text = lblText; 
} 

现在我想调用该方法从一个类(在我的情况下,它被称为MyInput)

我试着通过

Form1 F1 = new Form1(); 
F1.SetLabelText="This is an example"; 

或通过(不使用我创建的方法)

调用该方法10

然而,在这两种情况下,第二个Form1打开并导致我的程序的其余部分的各种问题。标签本身具有公共修饰符。

如何在MyInput类中实现更改label.text?

编辑: 首先我要感谢你的帮助。但建议的解决方案没有达到预期的效果。

我想我会告诉你更多的我的代码来解决这个问题:

Form1中:

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

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

      myInput.Check(); 

      public void SetLableText(string lblText) 
      { 
       lbl1.Text = lblText; 
      } 
     } 
    } 
} 

在我的课:

namespace Project2 
{ 
    class MyInput 
    { 

     public static void Check() 
     { 
      CODE FOR CHECKING STATUS OF DEVICE 

      if(status == 0) 
      { 
       //At this point lbl1.Text should be changed 
      } 
     } 
    } 
} 

我希望这有助于。

+0

你需要在这里发送完整的代码,我认为你需要了解更多的参考和“新”的关键字 –

+1

为什么不与文本返回一个字符串返回到表单并在那里修改或通过您的形式进入新类 – Adam

+3

在这两种情况下,您都在调用'new Form1()',它会生成一个* new *表单。如果您希望MyInput调用已存在的Form1上的方法,则需要将Form1引用传递给MyInput。 – mbeckish

回答

0

这里另一个建议: 这里是你的方法从您表格:

public void SetLabelText(string text) 
{ 
    lbl1.Text = text; 
} 
在这个类中你有你想要的方式,这需要 Form1作为参数 这将 工作,如果 MyInputForm1

在相同的命名空间中,或者如果添加适当的引用!

class MyInput 
{ 
    public static void Check(Form1 form) 
    { 
     // do what ever job you have to do 
     form.SetLabelText("JobResultHere"); 
    } 
} 

编辑:

现在它强烈地依赖于其中该函数的调用情况:

MyInput.check(... 

如果调用的类形式与需要的标签那么你会这样称呼它

MyInput.check(this); 

this代表发生呼叫的类的当前实例。

如果你想从别的地方调用它,请确保Form1实例就在眼前。

不要使用new,如果你不打算创建的Form1

here一个新的实例是关于如何使用new,它会对程序流程有何影响的文档。希望这可以帮助。

+0

感谢您的建议。然而,当我不喜欢这样的VS说,他不知道'this'在'myinput.methodToCallMethodFromForm(这)' – SUM

+0

从哪里要调用此方法@SUM?你的表单在那里? –

+0

@SUM看起来有点扭曲:)我想你想调用'Form1'之外的'MyInput'方法可能在第三类? –

0

通过致电Form F1 = new Form1()您正在创建表单的新实例,这就是您看到第二个窗口的原因。

您需要在首次创建时在某处存储对表单的引用。那么你需要在该实例上调用SetLabelText()

例如

// Program.cs 
public static Form1 _form; 
// sample main method 
public static void Main(string[] args) 
{ 
    _form = new Form1(); 
    Application.Run(_form); 
} 

然后,你可以把它作为Program._form.SetLabelText("Whatever the string is.");

-1

你正在创建Form1的每一次使用之后即改变的地方另一种形式的新关键字时一个新实例的首次。

您所需要的样本代码可以像

class MyInput 
{ 
    private Form1 form; 

    public MyInput(Form1 form1) 
    { 
     this.form = form1; 
     setFormText("test"); 
    } 

    private void setFormText(string text) 
    { 
     form.label1.Text = text; 
    } 
} 

这样你就可以像在Form1中

var myinput = new MyInput(this); 

,并在Form1 MyInput类中使用时完成。 使用相同的方法,您可以通过构造函数将表单实例传递给另一个表单。

但是,如果您正在尝试在代码示例中执行的操作,那么您可能需要对引用和实例进行更多的研究。

+0

这里的问题是,如果你在'MyInput'中实例化表单并且它是应用程序的主窗体,'Main()'方法必须创建'MyInput'的程序范围实例。 –

+0

在大多数情况下,该标签是私人的。你不能在这里触摸它。 – Adam

+0

@Adam OP写道:“标签本身具有公共修饰符。”所以我就这样回答 –