0

私は自分のプログラムの次の関数を見つけようとしていますが、これはこのコードでなんとかできました:

 int findPos = 0;
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            string s = textBox1.Text;
            richTextBox1.Focus();
            findPos = richTextBox1.Find(s, findPos, RichTextBoxFinds.None);
            richTextBox1.Select(findPos, s.Length);
            findPos += textBox1.Text.Length;
            //i = richTextBox1.Find(s, i + s.Length, RichTextBoxFinds.None);
        }
        catch
        {
            MessageBox.Show("No Occurences Found");
            findPos = 0;
        }
    }

そして、それはform1でうまく機能しますが、このコードを使用してform2から呼び出そうとすると、何もしません:

  //Form1
  public void FindNext()
    {
        try
        {
            this.Focus();
            Form2 frm2 = new Form2();
            string s = frm2.textBox1.Text;
            richTextBox1.Focus();
            findPos = richTextBox1.Find(s, findPos, RichTextBoxFinds.None);
            richTextBox1.Select(findPos + 1, s.Length);
            findPos += textBox1.Text.Length;
        }
        catch
        {
            MessageBox.Show("No Occurences Found");
            findPos = 0;
        }
    }

 //Form2
 private void button1_Click(object sender, EventArgs e)
    {
        Form1 frm1 = new Form1();
        frm1.FindNext();
    }

これがなぜなのか誰にも分かりますか?ありがとう、タナー。

4

5 に答える 5

1
  string s = Interaction.InputBox("enter search text", "Notepad-search", "", 100, 100);
    //The above syntax is from vb.net so add reference as microsoft.VisualBasic from   references. The above code creates an alertbox. Then type the text which you want search and click on ok.

           int f = richTextBox1.Find(s);
           if (f >= 0)
           {
               MessageBox.Show("search Text is found");
           }
           else
           {
               MessageBox.Show("search Text is not found");
           }
于 2010-09-17T06:32:40.823 に答える
0

frm1 の新しいインスタンスのテキスト ボックスには値がありませんか? したがって、メソッドが行うことは何もありません...

コードをステップ実行して、実際に使用する値があることを確認してみてください。

あなたが言う時:

Form1 frm1 = new Form1();

新しいバージョンを作成しているので、追加された追加情報は frm1 にアクセスするときにありません

これを試してみてください、あなたは私が何を意味するかを見るでしょう

Form1 frm1 = new Form1();
frm1.Show();

このコードが実行されると、フォームの別のインスタンスを実際に作成したことがわかります。

必要なことは、新しいインスタンスを作成するのではなく、元のインスタンスで作業することです。これにより、テキスト ボックスにすべての情報が保持されます。

これを解決するのはあなたに任せますが、あなたの答えがあります:)

于 2010-05-14T14:53:52.823 に答える
0

を記述することによりForm1 frm1 = new Form1();、フォームのまったく新しいインスタンスを作成することになります。このインスタンスはForm1テキストを取得せず、ユーザーに表示されることもありません。

Form1元のインスタンスをForm2inForm2のコンストラクターに渡す必要があります。

同様に、 に書き込むForm2 frm2 = new Form2();FindNext、テキストのないまったく新しいForm2インスタンスが作成されます。
代わりに、テキストをパラメーターとしてFindNextメソッドに渡す必要があります。

例えば:

public void FindNext(string searchText) {
    ...
    findPos = richTextBox1.Find(searchText, findPos, RichTextBoxFinds.None);
    ...
}

originalForm.FindNext(textBox1.Text);
于 2010-05-14T14:56:59.053 に答える
0

Form1どのように参照しForm2、お互いを参照するかについて、混乱する可能性があると思います。

と の新しいインスタンスへの参照を呼び出しnew Form()new Form2()作成すると、既に開いているフォームは参照されません。既存のインスタンスの参照を取得する必要があります。Form1Form2

Form1それがアプリケーションのメイン フォームであり、それが を作成して表示すると仮定すると、それを作成したインスタンスを表すForm2プロパティを に追加するか、この目的のためにプロパティを適切にすることができます(それをお勧めします)。Form2Form1Owner

最初Form1に表示されるコードで(上記のコードではなく)、の代わりに を呼び出します。これにより、インスタンスのプロパティが、インスタンスを開いた Thinstance に等しく設定されます。Form2frm2.Show(this)frm2.Show()OwnerForm2Form1

次に、ボタンのコードを次のように変更しますForm2

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1 frm1 = (Form1)Owner;
    frm1.FindNext(); 
} 

これにより、必要な新しいフォームではなく、既存のフォームを参照するようになります。

関数に関する限り、FindNext2 つの選択肢があります。 の参照を保持してForm2(おそらくとにかくこれを実行したいでしょう)、テキストに直接アクセスするかFindNext、文字列を取得するように変更できます (これが私が行っていることです)。をお勧めします)。

public void FindNext(string searchText)
{
    try
    {
        this.Focus();
        richTextBox1.Focus();
        findPos = richTextBox1.Find(searchText, findPos, RichTextBoxFinds.None);
        richTextBox1.Select(findPos + 1, searchText.Length);
        findPos += searchText.Length;
    }
    catch
    {
        MessageBox.Show("No Occurences Found");
        findPos = 0;
    }
}

次に、呼び出しをfrm1.FindNext()onForm2に変更しfrm1.FindNext(textBox1.Text)ます。

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1 frm1 = (Form1)Owner;
    frm1.FindNext(textBox1.Text); 
} 
于 2010-05-14T15:00:48.293 に答える
0

Form2 の 2 つの異なるインスタンスを参照しているようです。

Form1.FindNext() には、作成している Form2 の新しいインスタンスがあり、FindNext() を呼び出しているインスタンスとは異なるテキスト値を取得しています。

あなたがやりたいことは、フォームのインスタンスを FindNext() に渡すことです。だからあなたの機能は...

//Form1
 public void FindNext(Form2 frm2)
{
    try
    {
        this.Focus();
        string s = frm2.textBox1.Text;
        richTextBox1.Focus();
        findPos = richTextBox1.Find(s, findPos, RichTextBoxFinds.None);
        richTextBox1.Select(findPos + 1, s.Length);
        findPos += textBox1.Text.Length;
    }
    catch
    {
        MessageBox.Show("No Occurences Found");
        findPos = 0;
    }
}

//Form2
 private void button1_Click(object sender, EventArgs e)
 {
    Form1 frm1 = new Form1();
    frm1.FindNext(this);
 }
于 2010-05-14T15:02:03.920 に答える