【发布时间】:2017-10-02 22:46:31
【问题描述】:
我目前正在更新一个使用 WinForms 的 C# 项目。我想做的小改动之一如下。
该项目有一个表单,当前允许用户单击一个按钮,然后打开一个文件夹浏览器窗口,他们可以在其中为项目选择一个文件夹以从中检索信息。选中的目录被选中后会被输入到一个TextBox中。但是,单击文本框也会打开文件夹浏览器窗口。您目前也无法在 TextBox 中手动输入文本。
我想要做的是(希望)非常简单:我希望用户能够手动将目录输入到 TextBox 并让项目接受该文本输入,并且让 TextBox 不打开文件夹浏览器点击后的表单。
要记住的其他一些事项:
- 我不熟悉 WinForms 的所有细节,所以我很可能错过了一些我可以做的简单事情。
- 我也在对项目进行完全重组,所以如果这在 WinForms 中是不可能的,但在 WPF 中是可能的,那么在这种情况下,这对我来说不是主要障碍。
这里是按钮的代码,或者至少是相关部分,作为参考。 txtProjectDir 是有问题的文本框。除了这部分,代码中的TextBox没有做太多其他事情。
private void btnBrowse_Click(object sender, EventArgs e)
{
if (chooseProjectFolderDialog.ShowDialog() == DialogResult.OK)
{
clbConvertProjects.Items.Clear();
clbProjects.Items.Clear();
txtProjectDir.Text = chooseProjectFolderDialog.SelectedPath;
cur_projDir = txtProjectDir.Text;
更新:我根据几位用户的意见做了一些更改(顺便感谢大家)。这就是代码的相关部分现在的样子:
private void btnBrowse_Click(object sender, EventArgs e)
{
if (chooseProjectFolderDialog.ShowDialog() == DialogResult.OK)
{
clbConvertProjects.Items.Clear();
clbProjects.Items.Clear();
cur_projDir = txtProjectDir.Text;
我还必须将 TextBox 更改为非只读,并从其 Event 属性中删除对上述方法的引用。现在它能够接受用户输入,并且在单击时不会打开文件夹浏览器。
唯一的问题是:如果我只在 TextBox 中直接输入文本,而不是通过浏览器弹出窗口选择文件夹,程序似乎无法正确接受输入(即,没有从目录)。显然,我仍然需要让程序接受用户输入,因为它目前不接受。
更新 2:在获得更多建议(再次感谢大家)和良好的旧试验和错误之后,我重新插入了 txtProjectDir.Text = chooseProjectFolderDialog.SelectedPath; 行,因为从方法中删除它会产生不良影响关于程序的功能。不过,我仍然遇到程序接受用户手动输入到 TextBox 的问题。
更新 3:根据@blaze_125 的建议,当用户离开时,我将不得不为 TextBox 创建一个新事件。谢谢大家的帮助,不胜感激!
【问题讨论】:
-
您缺少一些简单的东西。选择设计器中的框,然后单击“属性”窗口中的闪电图标。向您显示正在使用的事件。
-
@Hans 的意思是文本框的 Enter、GotFocus 或 Click 事件可能也由
btnBrowse_Click直接或间接处理。不必验证输入听起来像是一个聪明的技巧,但即使是使用文件夹浏览器窗口选择的文件夹也可以在之后重命名、删除或以其他方式(使)无法访问。 -
@Hans Passant:TextBox 的唯一事件是 Action -> Click,设置为
btnBrowse_Click。没有填充其他事件。显然这不是我想要发生的事情,所以我想我需要为此制定一个新方法? -
右击 => 重置。
-
btnBrowse_Click不是您想要发生的,但那是关联的事件。这就是您要从该文本框中删除的事件。在您当前的要求中,只有按钮应该调用btnBrowse_Click,但目前您的按钮和文本框都在这样做。