我正在尝试查找,找到我的程序的下一个函数,我确实使用此代码:
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();
}
有人知道这是为什么吗? 谢谢,唐纳。
答案 0 :(得分: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");
}
答案 1 :(得分:0)
新的frm1实例上的文本框肯定没有价值吗?所以这个方法没有什么可做的......
尝试单步执行代码并检查您实际上是否有要使用的值?
当你说:
Form1 frm1 = new Form1();
您正在创建一个新版本,以便在访问frm1时添加的任何额外信息
试试这个,你会看到我的意思
Form1 frm1 = new Form1();
frm1.Show();
当此代码被删除时,您将看到您实际上已经创建了另一个表单实例。
您需要做的是使用原始实例而不是创建新实例,这样您仍然可以在文本框中包含所有这些信息。
我会让你一起工作,但你有答案:)
答案 2 :(得分:0)
通过撰写Form1 frm1 = new Form1();
,您正在创建Form1
表单的全新实例,该实例永远不会获取任何文本,也不会向用户显示。
您需要将原Form1
个实例传递给Form2
构造函数中的Form2
。
同样,当您在Form2 frm2 = new Form2();
中撰写FindNext
时,您正在创建一个没有任何文字的全新Form2
实例。
相反,您应该将文本作为参数传递给FindNext
方法。
例如:
public void FindNext(string searchText) {
...
findPos = richTextBox1.Find(searchText, findPos, RichTextBoxFinds.None);
...
}
originalForm.FindNext(textBox1.Text);
答案 3 :(得分:0)
我认为您可能会混淆彼此引用Form1
和Form2
的方式。
调用new Form()
和new Form2()
创建对Form1
和Form2
的新实例的引用,但它们不会引用已经存在的表单打开。您需要获取现有实例的参考。
假设Form1
是您的应用程序的主要表单,并且它创建并显示Form2
,您可以向Form2
添加一个代表Form1
实例的属性创建它,或者您可以为此目的使用Owner
属性(我建议这样做)。
在最初显示Form1
的{{1}}代码中(不在您上面的代码中),请致电Form2
而不是frm2.Show(this)
。这会将frm2.Show()
实例的Owner
属性设置为等于打开它的Form2
的精简版。
然后将Form1
的按钮代码更改为:
Form2
这将使您引用现有表单而不是新表单,这是您想要的。
就private void button1_Click(object sender, EventArgs e)
{
Form1 frm1 = (Form1)Owner;
frm1.FindNext();
}
函数而言,你有两个选择:要么你可以坚持FindNext
的引用(尽管你可能想要这样做)并直接访问文本,或者你可以改变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()
来电更改为Form2
:
frm1.FindNext(textBox1.Text)
答案 4 :(得分:0)
看起来您正在引用Form2的两个不同实例。
在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);
}