c# - 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”相对应的参数
有人能帮我解决这个问题吗?我确信这是一个超级简单的解决方法,但我已经完成了所有类似的问题,但我无法弄清楚。
谢谢!
解决方案
您的代码有一些损坏的部分。
首先,当您调用&时,您需要同时传递object sender
& ,您可以通过以下方式轻松做到这一点:EventArgs e
TestButton
DuckDuckGo_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();
}
}
}
}
请注意,只有一个搜索词框,但现在您可以轻松添加多个搜索引擎。
推荐阅读
- python - bulk_update_mappings 按不同于私钥的字段
- javascript - How do I get rid of an uncalled padStart Error
- python - 是否有一个 python 函数可以运行具有不同文件名的其他 .py 文件
- javascript - 在javascript(客户端)中处理许多base64编码图像的实用方法?
- angular - RxJS:如何在 Angular 中从外部和内部 Observable 获取输出
- c# - 将多个 Action 方法连接到一个 View
- sql - 在 postgresql 中更新和插入来自 csv 文件的记录
- php - 没有工匠命令的 Laravel 小型独立一次性脚本?
- excel - 在 VBA 中执行下一个命令之前强制方法(GetFromClipboard)完成
- swift - 具有不同单元格高度的水平集合视图