具有 OpenFileDialog C# 的默认名称

本文关键字:默认 OpenFileDialog 具有 | 更新日期: 2023-09-27 18:18:54

我在OpenFileDialog中设置默认文件名answer_XXXXXX.csv。但它像这样显示。默认名称"answerswer_XXXXXX.csv"未完整显示。

然后我单击文件名组合框。它准确显示。

我该如何解决它?

具有 OpenFileDialog C# 的默认名称

有一个小的解决方法。在呼叫ShowDialog()之前有以下行。

openfiledialog.ShowHelp = true;

例:

OpenFileDialog openfiledialog = new OpenFileDialog();
openfiledialog.ShowHelp = true;
openfiledialog.FileName = "answerswer_XXXXXXX.csv";
openfiledialog.ShowDialog();

欲了解更多信息:

.NET 4.5 WPF 功能区窗口在 VS2012 中损坏

这是另一种解决方法,您可以使用更复杂的 Win32 api 函数来访问文件名组合框并执行任何您想做的事情,但此解决方法使用 SendKeys ,我目前没有时间深入研究 Win32 API 函数:

public Form1()
    {
        InitializeComponent();
        t.Interval = 100;
        t.Tick += (s, e) =>
        {
            SendKeys.Send("{HOME}+{END}");
            t.Stop();
        };
}
Timer t = new Timer();
private void button1_Click(object sender, EventArgs e)
{
        OpenFileDialog open = new OpenFileDialog();
        open.FileName = "I love .NET so much";
        t.Start();
        open.ShowDialog();
}

我无法解释此错误,但有一些解决方法,上面的解决方法就是其中之一。

King King的回答似乎是最好的解决方案,我使用了基本相同的方法,但可能更简单一些(显然我没有直接对他的帖子投赞成票或评论的声誉(:

OpenFileDialog oFileD = new OpenFileDialog();
oFileD.InitialDirectory = initialDir;
oFileD.FileName = fileName;
if (oFileD.FileName != "")
{
    Timer t = new Timer();
    t.Interval = 100;
    t.Tick += (s, e) =>
    {
        SendKeys.Send("{HOME}+{END}");
        t.Stop();
    };
    t.Start();
}
if (oFileD.ShowDialog() == DialogResult.OK) {
    ...
}

我不能相信没有解决这个问题的方法;最初,它似乎陷入了 2 个Microsoft组之间的裂缝,并且接受了使用旧的丑陋对话框的解决方法。也许到那时支持正在从WinForms切换,但WinForms对我来说效果更好。我的解决方法很复杂,但我可能会保留它。

我不喜欢使用Sendkeys,因为密钥是排队的,可能会被不同的窗口拾取。使用假定对话框已准备就绪的计时很麻烦。此解决方案尝试解决这些问题,并在负载较重的 PC 上运行时表现出一定的稳健性。它可能会做得更优雅。

一些导入(有更好的方法吗?

public static class Util1
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int GetFocus();
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, int wMsg, int wParam, int lParam);
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount);
}
public static class Util1S
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, int wMsg, int wParam, string lpData);
}
public static class Util1SB
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, int wMsg, int wParam, System.Text.StringBuilder lpData);
}

该代码使用 Win32 api 调用来验证包含文件名的实际编辑控件的句柄,并在滚动几乎正确到字符分数(m 被截断为 n(的情况下替换其中的文本。重试会使用一小段时间来尝试修复。我从在线建议和我自己的建议中的其他尝试被注释掉了:

            //SaveFileDialog ofd;
            //using (ofd = new SaveFileDialog()                                
            OpenFileDialog ofd;
            using (ofd = new OpenFileDialog()
            {
                //AutoUpgradeEnabled = false,
                FileName = prevfile,
                InitialDirectory = prevdir,
                AddExtension = true,
                CheckFileExists = true,
                CheckPathExists = true,
                Title = title,
                DefaultExt = defext,
                Filter = filter
            })
            {
                string other = Directory.GetCurrentDirectory();
                if (!string.IsNullOrWhiteSpace(prevfile)) // workaround for previous file name not left-justified in edit field
                {
                    //ofd.Site.GetService().OnGotFocus()
                    //SendKeys.Send("{HOME}"); 
                    var t = new System.Windows.Forms.Timer();
                    int cnt = 0; // retry counter
                    t.Interval = 100;
                    t.Tick += (s, e) =>
                    {
                        ++cnt;
                        int hwnd = Util1.GetFocus();
                        G.Log("hwnd " + hwnd);
                        if (hwnd != 0)
                        {
                            var buf = new System.Text.StringBuilder(256);
                            Util1.GetClassName(hwnd, buf, 128);
                            G.Log("class " + buf);
                            if (buf.ToString().Equals("Edit"))
                            {
                                var buf2 = new System.Text.StringBuilder(1000);
                                Util1SB.SendMessage(hwnd, 13, 500, buf2); // hwnd WM_GETTEXT limit dest
                                G.Log("text " + buf2);
                                if (!string.IsNullOrWhiteSpace(buf2.ToString()) && buf2.ToString().Equals(prevfile))
                                {
                                    Util1S.SendMessage(hwnd, 12, 0, "");    // hwnd WM_SETTEXT 0 "str" 
                                    Util1SB.SendMessage(hwnd, 12, 0, buf2);    // hwnd WM_SETTEXT 0 "str" 
                                    //Util1.SendMessage(hwnd, 0x00B6, 1000, 0);    // hwnd EM_LINESCROLL 1000 0 : scroll right a whole lot
                                    //Util1.SendMessage(hwnd, 0x00B6, -1000, 0);    // hwnd EM_LINESCROLL -1000 0 : scroll left a whole lot
                                    //Util1.SendMessage(hwnd, 0x00B1, 0, 1);    // hwnd EM_SETSEL 0 1 : select first char
                                    Util1.SendMessage(hwnd, 0x00B1, 0, -1);    // hwnd EM_SETSEL 0 -1 : select all text
                                    cnt = 1000;
                                }
                            }
                        }
                        //SendKeys.Send("{HOME}+{END}");
                        if (cnt > 5)
                            t.Stop();
                    };
                    t.Start();
                }
                if (ofd.ShowDialog() == DialogResult.OK)
                {