我是c#的初学者,我正在开发一个小型的Windows窗体应用程序,一个可以控制RichTextBox1
文本的文本编辑器。 (更改字体类型,字体大小等)我想为项目创建查找和替换对话框。它有一个TextBox(txtText
),其文本应该在RichTextBox1.Text
中检查,一个“Find”按钮(btnFind
)控件。我有代码,它检查并选择RichTextBox1.Text
中的下一个文本,该文本与光标位置后txtText
的文本相匹配:
public void FindNextText(string Text)
{
int TextSelectionStartIndex;
int CursorPosition = RichTextBox1.SelectionStart;
if (RichTextBox1.SelectedText == Text)
{
TextSelectionStartIndex= RichTextBox1.Text.IndexOf(Text, CursorPosition + 1);
}
else
{
TextSelectionStartIndex= RichTextBox1.Text.IndexOf(Text, CursorPosition);
}
RichTextBox1.Select(TextSelectionStartIndex, Text.Length);
}
唯一的问题是,此方法位于我的MainForm
类中,而Click按钮(Click事件调用此方法)位于我的FindAndReplaceForm
类中。
我已经尝试过这段代码来调用它:
public partial class FindAndReplaceForm : Form
{
//...
private void btnFind_Click(object sender, EventArgs e)
{
MainForm mf = new MainForm();
mf.FindNextText(txtText.Text);
}
//...
}
但如果我这样做,将调用并执行新的MainForm方法,并且不会在原始格式的RichTextBox1.Text
中选择任何内容。
任何人都可以帮助我如何在不创建类的新对象的情况下调用原始MainForm
的此方法吗?
是否可以不将MainForm
设置为父级,将FindAndReplaceForm
设置为子级表单?
感谢您提供任何帮助!
答案 0 :(得分:4)
在Utils类中创建static
并将RichTextBox作为参数传递:
public static void FindNextText(RichTextBox rtb, string Text)
{
int TextSelectionStartIndex;
int CursorPosition = rtb.SelectionStart;
...
}
然后你称之为:
private void btnFind_Click(object sender, EventArgs e)
{
//MainForm mf = new MainForm();
MyUtilsClass.FindNextText(this.RichTextBox1, txtText.Text);
}
答案 1 :(得分:1)
为了调用像FindNextText
这样的实例方法,你总是需要一个类的实例。
但是,这并不意味着您每次都必须使用new
创建实例,这会破坏面向对象编程的目的。如果您的FindAndReplaceForm
需要对MainForm
的引用,那么在您的广告投放中明确表示它,那么只需添加对它的引用,例如
public class FindAndReplaceForm {
private readonly MainForm _mainForm;
public FindAndReplaceForm(MainForm mainForm) {
if (mainForm == null) throw new ArgumentNullException("mainForm");
_mainForm = mainForm;
InitializeComponent();
}
[...]
}
当您在其中一个MainForm
方法中创建该表单时,只需添加this
作为参数:var findForm = new FindAndReplaceForm(this);
。
然后你可以打电话
_mainForm.FindNextText(txtText.Text);
或者您也可以在FindAndReplaceForm
中使用带有公共设置器的属性,但我个人更喜欢构造函数的用户。
答案 2 :(得分:1)
声明FindAndReplace
表单中的委托以及此委托类型的公共属性
当你需要调用FindAndReplace表单时,将此属性设置为FindNextText方法的地址,在FindAndReplaceForm测试中如果已设置此属性并调用其中定义的方法
public partial class FindAndReplaceForm : Form
{
public delegate void OnFindText(string txtToFind);
public OnFindText FindText;
private void btnFind_Click(object sender, EventArgs e)
{
if(FindText != null)
FindText(textToSearchFor);
}
}
当您调用FindAndReplace表单时,请将其与
一起使用FindAndReplaceForm f = new FindAndReplaceForm();
f.FindText += FindNextText;
f.ShowDialog();
使用这种方法,您不会将FindAndReplace
表单与主表单相关联。您只需将搜索算法的执行推迟到为搜索设置自己的处理程序的任何调用者。