0

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() で Notepad1._0.RenameFunc.button1_Click_1(オブジェクト送信者、EventArgs e) で D:\C#\Notepad1.0\Notepad1 .0\RenameFunc.cs:24行目

修正方法は?

4

3 に答える 3

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に関する少しの説明は有益です

于 2012-07-03T13:37:29.867 に答える
1

次のようにできます。

 Form1 frm = (Form1)this.Parent;

を使用してコントロールにアクセスしfrm.Controls、好きなことを行うことができます。

于 2012-07-03T13:42:05.500 に答える
0

frm1.tabControl1.SelectedTabに見つからないことを示すエラーが返され frm1.tpます。あなたのコードは 30 個のタブページをあなたが示したものと関連付けていtpないため、 astabControl1の新しいコピーを作成し、タブページの名前を選択されたものを探すときのテキストボックス、答えは、それらの新しいページはどれも選択されていないということです。form1frm1

于 2012-07-03T13:48:52.157 に答える