2013-06-26 144 views
-3

這非常適用:無法更改文本框的文本

private void button1_Click(object sender, EventArgs e)   
    { 
     textBox1.Text = "dsfsdfsd"; 
    } 

但是當我使用它像這樣它永遠不會成功運作的textbox1.text昌編譯但文字不顯示任何

private void button1_Click(object sender, EventArgs e) 
    { 
     Form1 form1 = new Form1(); 
     form1.click(); 
    } 

public void click() 
    { 
     textBox1.Text= "asdasdas"; 
    } 

請告訴我爲什麼我不能改變文本框的文本,除了直接處理用戶(按鈕)的方法,即使我在(按鈕)方法和textbox1.text=("asdasdas");方法之間放置了一個橋接方法,它永遠不會作品。請指教。

+0

它可能是你打電話點擊一個新的創建從哪個不顯示? – wonko79

+4

我推薦閱讀一些關於面向對象的好書。 – Leri

回答

1

這是因爲你正在爲new一個新的Form1實例。 button1_ClickForm1的成員,因此您已經有了需要使用的Form1實例。

private void button1_Click(object sender, EventArgs e) 
{ 
    this.click(); // or just `click();` 
} 

public void click() 
{ 
    textBox1.Text= "asdasdas"; 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 

} 
+0

謝謝你這麼多,我現在understande的概念,但如果我想打電話從program.cs.i Click方法使用該代碼 Form1.cs的 私人無效的button1_Click(對象發件人,EventArgs的){ Program.bridge (); } Program.cs的 公共靜態無效橋() { Form1中有新= Form1中(); there.click(); } Form1.cs的 公共無效點擊() { textBox1.Text = 「asdasdas」; textBox1.TextChanged + = newEventHandler(textBox1_TextChanged); } – user2523189

+0

user2523189,我想你需要學習面向對象編程的基礎知識,以進一步提高你在這方面的知識。你的程序以一個靜態方法Main()方法開始。從這裏開始,您可以運行一系列命令(方法調用)或更可能的方式,創建一個類的實例(如表單)並調用其中的一個方法。在這個例子中,你有你的Form1這樣做 - 你不需要再看看program.cs。 – jamespconnor

4
private void button1_Click(object sender, EventArgs e) 
{ 
    click(); 
} 

您不需要創建表單的新實例來調用其方法之一。

+0

謝謝soooo it it workeeedddd :)))))))))))))))))) – user2523189

+0

@ user2523189您的click方法不能是靜態的,因爲它引用實例字段。 –

0

因爲你正在呼籲新Form實例click()方法,你的代碼改成這樣:

private void button1_Click(object sender, EventArgs e) 
{ 
    click(); 
} 

public void click() 
{ 
    textBox1.Text= "asdasdas"; 
} 
0

你使窗體的新實例,並點擊是,這是不是你的形式正在看,所以你不會看到變化。

取而代之的只是調用這種形式的Click()方法。

2

您應該訂閱TextChanged事件實際上改變的是文本,否則事件處理程序尚未附:

public void click() 
{ 
    textBox1.TextChanged += new EventHandler(textBox1_TextChanged); 
    textBox1.Text = "asdasdas"; 
} 

而且你不應該訂閱多次到同一個事件當點擊方法被調用時。這將是更好地在構造函數中只有一次執行這個訂閱,例如:

public class Form1: Form 
{ 
    public Form1() 
    { 
     textBox1.TextChanged += new EventHandler(textBox1_TextChanged); 
    } 

    public void click() 
    { 
     textBox1.Text = "asdasdas"; 
    } 

    public void textBox1_TextChanged(object sender, EventArgs e) 
    { 

    }  
} 
+0

這真的很重要嗎(因爲事件處理程序什麼都不做)?他應該展示形式。 –

+0

當然重要。他在更改文本並預期事件被觸發後訂閱了TextChanged事件。在他的例子中,這個事件是空的,但我想他預計它會被觸發。 –

+0

我試過這個,但它沒有工作我的朋友:( – user2523189

0

我覺得你Program.bridge通話造成混亂。

private void button1_Click(object sender, EventArgs e) 
{ 
    Program.bridge();   
} 

在該方法中,您正在實例化一個新的Form1。這對已經顯示的表單沒有影響。試着改變你的button1_click功能通過以下方式,看看是否有幫助:

private void button1_Click(object sender, EventArgs e) 
{ 
    this.click();   
} 

編輯: 如果必須使用bridge的方法,你可以像這樣在你的Program.cs

public static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     TheForm = new Form1(); 
     Application.Run(TheForm); 
    } 

    private static Form1 TheForm { get; set; } 

    public static void bridge() 
    { 
     TheForm.Click(); 
    } 
} 

我不推薦這種方法,但如果你必須...

+0

這樣的工作,但我想改變從program.cs文本becouse我需要在我的代碼中的這個功能:) – user2523189

+0

@ user2523189然後你必須重構你的代碼。在program.cs中,您必須保存對錶單的引用,以便稍後可以對其進行處理。 –

+0

,我該怎麼做? – user2523189