C#从另一个表单错误打开表单

时间:2012-07-03 13:33:34

标签: c# visual-studio-2010

Form1.cs 我有

public const int n = 30;
public TabPage[] tp = new TabPage[n];

private void toolStripSeparator1_Click(object sender, EventArgs e)
{
    RenameFunc rf = new RenameFunc();
    rf.ShowDialog();
}

RenameFunc.cs 我有

private void button1_Click_1(object sender, EventArgs e)
{
    Form1 frm1 = new Form1();

    if (textBox1.Text != null)
    /*Line 24 */    frm1.tp[Array.IndexOf(frm1.tp, frm1.tabControl1.SelectedTab)].Text = textBox1.Text;
    Application.Exit();

}

tabControl1也是tu public

第24行

我收到错误

System.NullReferenceException:未将对象引用设置为对象的实例。    在System.Windows.Forms.TabControl.get_SelectedTabInternal()    在System.Windows.Forms.TabControl.get_SelectedTab()    在D:\ C#\ Notepad1.0 \ Notepad1.0 \ RenameFunc.cs:第24行的Notepad1._0.RenameFunc.button1_Click_1(对象发件人,EventArgs e)

如何纠正?

3 个答案:

答案 0 :(得分:2)

我不知道tp是什么,但是,我确定它没有初始化,这就是例外。
原因很容易在上一行中找到

Form1 frm1 = new Form1();

在这里创建一个Form1的新实例。您没有引用调用RenameFunc的第一个Form1。

也许你可以在调用RenameFunc时传递对正确Form1的引用,例如

RenameFunc rf = new RenameFunc(this); 

并在RenameFunc内部变量中保留该引用

public partial class RenameFunc : Form
{
    private Form1 _caller = null;
    public RenameFunc(Form1 f)
    {
         InitializeComponent();
         _caller = f;       
    }

}

并在button1_Click_1中使用该引用而不是新的Form1

   if (textBox1.Text != null)           
        _caller.tp[Array.IndexOf(_caller.tp, _caller.tabControl1.SelectedTab)].Text =
                   textBox1.Text;           
   Application.Exit();       

然而,对tp的一点解释将是有益的

答案 1 :(得分:1)

您可以执行以下操作,

 Form1 frm = (Form1)this.Parent;

您可以使用frm.Controls访问控件,并且确实喜欢使用它。

答案 2 :(得分:0)

它返回时出现错误,告诉您在frm1.tabControl1.SelectedTab中找不到frm1.tp,您的代码中没有任何代码将tp中的30个标签与您tabControl1的标签相关联因此,通过制作form1 frm1的新副本,然后在查找所选内容时要求在文本框中放置标签页的名称,答案是,这些新页面都不是地选择。