2016-07-06 54 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寫道:「標籤本身具有公共修飾符。」所以我就這樣回答 –