2017-07-31 124 views
1

而不是在design.cs中使用预先创建的TextBox控件,我使用的是编程式添加的TextBox。首先,这个TextBox由用户填充,并且通过一个onClick方法的按钮,内容在另一个由onClick方法调用的类文件中的方法内处理。之后,我想删除文本框中的任何内容,并使其像初始状态一样变空,但它不起作用。无法访问以编程方式添加的控件(C#)

/*MainForm.cs*/ 
private TextBox tb; 
private SubForm sf = new SubForm(); 
private void initTextBox(){ 
    tb = new TextBox(); 
    preExistingPanel.Controls.Add(tb); //attach the textbox onto a panel 
} 

private void MainForm_Load(object sender, EventArgs e){ 
    initTextBox(); 
} 

private void button_Click(object sender, EventArgs e){ 
    string tbContent = tb.Text; 
    sf.processData(tbContent); 
} 

public void EmptyTextBox(){ 
    tb.Text = "";  //This does not work, and nothing happens 
} 


/*SubForm.cs*/ 
public void processData(string tbContent){ 
    /*Do something with tbContent*/ 
    ... 
    ... 
    /*Here, I want to empty the textBox*/ 
    MainForm mf = new MainForm(); 
    mf.EmptyTextBox(); 
} 

可有人请帮我看看什么是错的代码?我知道

EmptyTextBox() 

方法被调用,但没有任何反应。

+0

什么是preExistingPanel,主要形式之间的关系子表单?没有这些信息,我不确定任何人都可以帮到您 – wnvko

回答

2

您在processData方法中创建了一个全新的MainForm实例。一个没有编程创建TextBox的地方(它没有被显示/ Load从未被调用 - 并且这不会是访问MainForms的正确方法)。所以,你会得到一个NullReferenceException当你调用EmptyTextBox().

你可以传给你的子窗体的construtor您的MainForm的参考(也删除您new MainForm线):

MainForm mf; 
public SubForm (MainForm main) 
{ 
    mf = main; 
} 
+0

这非常合理,谢谢!但是,我该如何解决这个问题呢?我知道在对方的类中创建彼此的新实例作为构造函数会导致StackOverFlowException。 – JessicaD

+0

不要每次都创建新的。通过参考。请参阅编辑。并有其他参考:https://stackoverflow.com/a/26862346/2957232 –

+0

谢谢!我得到它的工作! – JessicaD

相关问题