簡體   English   中英

如何在不創建該類的新對象的情況下調用其他類的方法? 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM