1

在我的程序中,我需要强制用户选择保存文件夹。我通过将 SelectedPath 设置为 MyComputer 来做到这一点。

我的问题是 OK 按钮最初没有被禁用。

行为:

  • 选择了“我的电脑”(浅灰色),但启用了“确定”按钮。
  • 单击“我的电脑”(现在选择深蓝色阴影)仍然选择了“确定”按钮。
  • 如果我选择说桌面,然后重新选择“我的电脑”,那么“确定”按钮才会被禁用。

我尝试过使用 SelectedPath 和 RootFolder,以及 Environment.SpecialFolder.MyComputer 和 Environment.GetPath() 均无济于事。

当 SelectedPath 不是有效文件夹时,如何禁用 OK 按钮?

编辑: 这是在 Visual Studio 2010 Professional 中开发的 Windows XP、.Net 4.0 上运行的。

编辑#2:添加了完整的示例代码。

using System;
using System.Windows.Forms;

using System;
using System.Windows.Forms;

namespace FolderBrowser
{
    public class Form1 : Form
    {
        private System.ComponentModel.IContainer components;
        private System.Windows.Forms.Button button1;

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();

            this.button1.Location = new System.Drawing.Point(10, 10);
            this.button1.Text = "Open FolderBrowserDialog";
            this.button1.Click += new System.EventHandler(this.SelectSaveFolderItem_Click);

            this.Controls.Add(this.button1);
            this.ResumeLayout(false);
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void SelectSaveFolderItem_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            fbd.SelectedPath = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}";
            fbd.ShowDialog();
        }

    }
4

1 回答 1

2

参考:MSDN:禁用文件夹浏览器对话框中的按钮

在上面的 msdn 线程中,用户希望在目录不存在时禁用文件夹浏览器对话框中的接受按钮。我觉得这与您的问题有关: How can I disable the OK button when the SelectedPath is not a valid folder?

该线程中的解决方案是在显示对话框后使用 Timer 事件禁用 OK 按钮。我为您将 VB.Net 代码转换为 C#:

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class Form1
{
    [DllImport("user32.dll", EntryPoint = "FindWindowA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]

    private static extern Int32 FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", EntryPoint = "FindWindowExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]

    private static extern Int32 FindWindowEx(Int32 hWnd1, Int32 hWnd2, string lpsz1, string lpsz2);
    [DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]

    private static extern Int32 EnableWindow(Int32 hwnd, Int32 fEnable);


    private void Button1_Click(System.Object sender, System.EventArgs e)
    {
        Timer1.Enabled = true;

        FolderBrowserDialog fld = new FolderBrowserDialog();

        fld.ShowDialog(this);

    }


    private void Timer1_Tick(System.Object sender, System.EventArgs e)
    {
        Int32 hwndMainWindow = default(Int32);

        hwndMainWindow = FindWindow("#32770".Trim(), Constants.vbNullString);
        // '#32770 (Dialog)#32770 (Dialog)


        if (hwndMainWindow) {
            Int32 hwndBtn = default(Int32);

            hwndBtn = FindWindowEx(hwndMainWindow, IntPtr.Zero, "Button", "OK");


            if (hwndBtn) {
                EnableWindow(hwndBtn, 0);

            }

        }

        Timer1.Enabled = false;

    }

}
于 2012-05-28T02:32:16.343 回答