2014-02-23 55 views
0

我是c#的初學者,我正在研究一個小窗口窗體應用程序,一個文本編輯器,它可以控制我的文本RichTextBox1。 (更改字體類型,字體大小等)我想創建一個查找和替換對話框到我的項目。它有一個文本框(txtText),其文本應在RichTextBox1.Text中檢查,並有一個「查找」按鈕(btnFind)控件。我的代碼,其中審查並選擇在RichTextBox1.Text接下來的案文txtText文本光標所在位置後一致:如何在不創建類的新對象的情況下調用其他類的方法? c#

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事件調用此方法在我的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設爲子窗體?

感謝您的幫助!

回答

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使用屬性與公共二傳手,但我個人更喜歡構造函數的用戶。

+0

謝謝!它適用於表單。但是還有一件事我不得不在_mainForm = mainForm:InitializeComponent()方法下加載所有表單的控件和組件,而不僅僅是一個空表單。 – Richtenzorg

+0

@Richtenzorg我已經將該調用添加到構造函數的InitializeComponent。您還應該在構造函數中檢查'main'的'mainForm'參數,但我最初忽略了檢查以縮短代碼。 – Dirk

4

讓它static在utils的類,並通過在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

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形式的主要形式。您只需將搜索算法的執行推遲到爲搜索設置其自己的處理程序的任何調用方。

相關問題