【问题标题】:How do I call a method of an other class without creating a new object of the class? c#如何在不创建类的新对象的情况下调用其他类的方法? C#
【发布时间】:2014-03-24 21:23:50
【问题描述】:

我是 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 类中,而单击事件调用此方法的查找按钮在我的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 设置为子表单?

感谢您的任何帮助!

【问题讨论】:

    标签: c# class text methods call


    【解决方案1】:

    在 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);
    }
    

    【讨论】:

      【解决方案2】:

      为了调用像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 中使用带有公共设置器的属性,但我个人更喜欢构造函数的用户。

      【讨论】:

      • 谢谢!它非常适合表单。但是我还必须在 _mainForm = mainForm 下添加一件事:InitializeComponent() 方法来加载表单的所有控件和组件,而不仅仅是一个空表单。
      • @Richtenzorg 我已将对 InitializeComponent 的调用添加到构造函数中。您还应该在构造函数中检查nullmainForm 参数,但我最初省略了该检查以使代码更短。
      【解决方案3】:

      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 表单与主表单耦合。您只需将搜索算法的执行推迟到为搜索设置自己的处理程序的任何调用者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        • 2022-11-20
        相关资源
        最近更新 更多