首页 > 解决方案 > c#按钮调用几种方法

问题描述

我正在开发一个可以跨多个搜索引擎进行浏览器搜索的应用程序。我目前正在设置界面,这是我的代码:

namespace OIT
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        public void TestButton(object sender, EventArgs e)
        {
            Process proc = new();
            proc.StartInfo.UseShellExecute = true;
            proc.StartInfo.FileName = "https://google.ca/search?q=" + GoogleTextBox.Text;
            proc.Start();
        }


        public void DuckDuckGo_Click(object sender, EventArgs e)
        {
            Process proc = new();
            proc.StartInfo.UseShellExecute = true;
            proc.StartInfo.FileName = "https://duckduckgo.com/?q=" + DDGTextBox.Text;
            proc.Start();
        }

        private void SearchAll_Click(object sender, EventArgs e)
        {
            if (GoogleTextBox.Text + DDGTextBox.Text == "") 
            {
                MessageBox.Show("Please enter search terms.");
            }
            else
            {
                TestButton();
                DuckDuckGo_Click();
            }
          
        }

    }
}

问题是按钮上的testbutton()duckduckgo_click();方法导致参数错误:

错误 CS7036
没有给出与“Form1.TestButton(object, EventArgs)”所需的形参“sender”相对应的参数

有人能帮我解决这个问题吗?我确信这是一个超级简单的解决方法,但我已经完成了所有类似的问题,但我无法弄清楚。

谢谢!

标签: c#

解决方案


您的代码有一些损坏的部分。

首先,当您调用&时,您需要同时传递object sender& ,您可以通过以下方式轻松做到这一点:EventArgs eTestButtonDuckDuckGo_Click

TestButton(sender, e);
DuckDuckGo_Click(sender, e);

但是,这样做会强制您的代码在处理程序中为这两个按钮运行代码。

因此,假设您决定在另外两个按钮处理程序中放置一些验证代码。像这样:

public void DuckDuckGo_Click(object sender, EventArgs e)
{
    if (DDGTextBox.Text == "")
    {
        MessageBox.Show("Please enter a search term.");
    }
    else
    {
        Process proc = new Process();
        proc.StartInfo.UseShellExecute = true;
        proc.StartInfo.FileName = "https://duckduckgo.com/?q=" + DDGTextBox.Text;
        proc.Start();
    }
}

现在,如果用户没有输入任何搜索词并且他们点击了SearchAll按钮,您的代码将抛出三个消息框。

相反,最好将点击处理程序与执行搜索的代码分开。

最好不要在可能的情况下重复自己。

就是这样。

从一种方法开始搜索过程:

private void StartSearch(string url_template, string search)
{
    Process proc = new Process();
    proc.StartInfo.UseShellExecute = true;
    proc.StartInfo.FileName = String.Format(url_template, HttpUtility.UrlEncode(search))
    proc.Start();
}

请注意,我已引入HttpUtility.UrlEncode以确保您不会从用户输入中创建非法 URL。

现在您可以使用两种辅助方法来启动每个搜索:

private void StartGoogleSearch(string search)
{
    StartSearch("https://google.ca/search?q=", search);
}

private void StartDuckDuckGoSearch(string search)
{
    StartSearch("https://duckduckgo.com/?q=", search);
}

现在你只剩下三个点击处理程序了:

private void TestButton(object sender, EventArgs e)
{
    if (GoogleTextBox.Text == "")
    {
        MessageBox.Show("Please enter search term.");
    }
    else
    {
        StartGoogleSearch(GoogleTextBox.Text);
    }
}


private void DuckDuckGo_Click(object sender, EventArgs e)
{
    if (DDGTextBox.Text == "")
    {
        MessageBox.Show("Please enter search term.");
    }
    else
    {
        StartDuckDuckGoSearch(DDGTextBox.Text);
    }
}

private void SearchAll_Click(object sender, EventArgs e)
{
    if (GoogleTextBox.Text == "" || DDGTextBox.Text == "")
    {
        MessageBox.Show("Please enter both search terms.");
    }
    else
    {
        StartGoogleSearch(GoogleTextBox.Text);
        StartDuckDuckGoSearch(DDGTextBox.Text);
    }
}

请注意,if在最后一个中正确检查任一术语是否为空白,而不仅仅是聚合。您现有的代码被破坏了,如果您仅在一个框中键入文本,它将启动两个搜索。


说了这么多,如果你问我怎么写,可能更像是这样:

private Dictionary<string, string> _engines = new Dictionary<string, string>()
{
    { "Google", "https://google.ca/search?q=" },
    { "DuckDuckGo", "https://duckduckgo.com/?q=" },
}

private void TestButton(object sender, EventArgs e)
{
    StartSearch("Google");
}

private void DuckDuckGo_Click(object sender, EventArgs e)
{
    StartSearch("DuckDuckGo");
}

private void SearchAll_Click(object sender, EventArgs e)
{
    StartSearch("Google", "DuckDuckGo");
}

private void StartSearch(params string[] engines)
{
    if (SearchTextBox.Text == "")
    {
        MessageBox.Show("Please enter a search term.");
    }
    else
    {
        foreach (var engine in engines)
        {
            if (_engines.ContainsKey(engine))
            {
                Process proc = new Process();
                proc.StartInfo.UseShellExecute = true;
                proc.StartInfo.FileName = String.Format(_engines[engine], HttpUtility.UrlEncode(SearchTextBox.Text))
                proc.Start();
            }
        }
    }
}

请注意,只有一个搜索词框,但现在您可以轻松添加多个搜索引擎。


推荐阅读