winforms OpenFileDialog的默认名称C#?

qlvxas9a  于 2023-03-31  发布在  C#
关注(0)|答案(4)|浏览(177)

我在OpenFileDialog中设置了默认文件名为answer_XXXXXX.csv。但是它显示为这样。默认名称“answer_XXXXXX.csv”没有显示完整。
然后我点击文件名组合框。它显示完全一样。
我该怎么修呢?

fd3cxomn

fd3cxomn1#

有一个小的解决方法。在调用ShowDialog()之前在下面一行。

openfiledialog.ShowHelp = true;

示例:

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

更多信息:
.NET 4.5 WPF RibbonWindow broken in VS2012

ctrmrzij

ctrmrzij2#

这里是另一个解决方案,你可以使用更复杂的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();
}

我不能解释这个错误,但有一些工作区,上面的一个是其中之一。

u5rb5r59

u5rb5r593#

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) {
    ...
}
lskq00tm

lskq00tm4#

我不敢相信没有解决办法最初,它似乎陷入了两个微软小组之间的裂缝,并且使用旧的丑陋对话框的解决方案被接受。也许那时支持从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)
                {

相关问题