[英]how to use non static method inside other class without creating object in C#
[英]How do I call a method of an other class without creating a new object of the class? c#
我是C#的初學者,並且正在開發一個小型Windows窗體應用程序,一個文本編輯器可以控制RichTextBox1
的文本。 (更改字體類型,字體大小等),我想為我的項目創建一個“查找和替換”對話框。 它具有一個TextBox( txtText
),應在RichTextBox1.Text
檢查其文本,以及一個“查找”按鈕( 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
類中,而Find按鈕(即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
設置為子級表單呢?
感謝您的任何幫助!
使它在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);
}
為了調用諸如FindNextText
之類的實例方法,您始終需要該類的實例。
但是,這並不意味着您每次都必須使用new
來創建實例,這會違背面向對象編程的目的。 如果您的FindAndReplaceForm
需要對MainForm
的引用,則在您的演員表中顯然需FindAndReplaceForm
,然后只需添加對它的引用即可,例如
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
使用帶有公共設置器的屬性,但我個人更喜歡構造函數的用戶。
在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
表單耦合到主表單。 您只需將搜索算法的執行推遲到設置了自己的搜索處理程序的任何調用程序即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.