【问题标题】:Getting a TextBox to accept user input, not open a folder browser让文本框接受用户输入,而不是打开文件夹浏览器
【发布时间】:2017-10-02 22:46:31
【问题描述】:

我目前正在更新一个使用 WinForms 的 C# 项目。我想做的小改动之一如下。

该项目有一个表单,当前允许用户单击一个按钮,然后打开一个文件夹浏览器窗口,他们可以在其中为项目选择一个文件夹以从中检索信息。选中的目录被选中后会被输入到一个TextBox中。但是,单击文本框也会打开文件夹浏览器窗口。您目前也无法在 TextBox 中手动输入文本。

我想要做的是(希望)非常简单:我希望用户能够手动将目录输入到 TextBox 并让项目接受该文本输入,并且让 TextBox 不打开文件夹浏览器点击后的表单。

要记住的其他一些事项:

  1. 我不熟悉 WinForms 的所有细节,所以我很可能错过了一些我可以做的简单事情。
  2. 我也在对项目进行完全重组,所以如果这在 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,但目前您的按钮和文本框都在这样做。

标签: c# winforms


【解决方案1】:

但是,单击文本框也会打开文件夹浏览器窗口。

TextBox 的唯一事件是 Action -> Click,设置为 btnBrowse_Click

我想要做的是(希望)非常简单:我希望用户能够手动将目录输入到 TextBox 并让项目接受该文本输入,并且让 TextBox 不打开文件夹浏览器点击后的表单。

如果您不希望该事件(又名action->click)发生,则必须从该文本框中删除文本btnBrowse_Click 并将其留空。这将删除您当前链接到您的文本框点击的event

【讨论】:

  • 要添加到这个答案,所以它也在这里:一旦你从 TextBox 中删除 Click 事件,你需要在离开 TextBox 时添加一个新方法,以便如果您手动输入文本,则会出现相同的一般结果。再次感谢,大火!
【解决方案2】:

会有一个偶数链接到文本框txtProjectDir 以选中此文本框并在属性中选择闪电。

我会假设偶数是点击textbox

如果是这种情况,您可能想要删除它。

现在关于如何接受文本框中的内容作为您只想引用文本的值,即 textbox 中的值将是 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;

【讨论】:

  • 听起来像是半个答案。如果事件是关联的,那又是什么呢?
  • @CodeCaster 然后它需要取消链接 - 从右侧列中删除事件处理程序名称
  • @CodeCaster,如果事件在属性的视觉显示中被链接,那么用户可以通过删除该文本框中的文本来简单地删除“链接”。 Visual Studio 然后负责删除后面代码中的引用,尽管它可能不会删除附加到事件的方法。因此,一旦您从可视界面中删除链接,您最终会在后面的代码中得到一个未使用的方法。然而,如果“链接”实际上是在代码后面而不是通过可视化界面,那么用户必须查找它并直接从代码中删除事件订阅
  • @blaze 是的,我知道 WinForms 设计师的工作方式。 OP 没有,所以答案应该是edited 以包含它。
  • @CodeCaster,我知道......把它放在评论中,这样如果它没有在答案帖子中出现,至少它会在这里;)稍微低一点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2014-06-29
  • 2012-06-14
  • 2012-06-25
  • 1970-01-01
  • 2016-12-14
  • 2014-10-14
相关资源
最近更新 更多