【问题标题】:Show an OpenFileDialog and get the FileName property from it in one line显示一个 OpenFileDialog 并在一行中从中获取 FileName 属性
【发布时间】:2018-09-20 15:48:45
【问题描述】:

我正在开发一个简单的应用程序,我正在尝试获取用户选择的 exe 的快捷方式。它按原样工作,但我想知道是否可以在一行中打开对话框并从中获取文件路径,这样我就不必将对话框存储在内存中。

我知道可以在一行中调用多个方法,例如 string[] array = value.Trim().ToLower().Split('\\');,但是当我尝试使用 OpenFileDialog 进行这种类型的设置时,我收到有关方法不存在的错误。

这是我现在拥有的代码:

OpenFileDialog box = new OpenFileDialog(); box.ShowDialog(); pathTextBox.Text = d.FileName;

我想知道是否可以(为了简洁起见)设置类似pathTextBox.Text = new OpenFileDialog().ShowDialog().FileName;

【问题讨论】:

  • “将对话框存储在内存中”部分没有问题。它使用的内存将被自动回收。无论它是否只出现在一行上,它都使用相同的内存。
  • @AndrewMorton 我知道它会很快被回收。我只是想这样做,因为它现在的方式对我来说看起来很乱。
  • 将所有内容塞进一行并不一定会使代码“整洁”。

标签: c# winforms openfiledialog


【解决方案1】:

简短的回答:它被称为方法调用链。它适用于Trim().ToLower().Split(),因为Trim()ToLower() 返回string。您不能以这种方式链接调用ShowDialog,因为ShowDialog 方法返回DialogResult,它只是一个enum

但是,理论上您可以将其提取到单独的扩展方法中:

public static class OpenFileDialogExtensions
{
    public static string ShowDialogAndReturnFileName(this OpenFileDialog dialog)
    {
        // consider checking arguments
        dialog.ShowDialog(); 
        // consider checking the result of `ShowDialog` (e.g., user could close the dialog)
        return dialog.FileName;
    }
}

// Usage, just like you want:
pathTextBox.Text = new OpenFileDialog().ShowDialogAndReturnFileName();

请记住,更短的代码并不意味着更好的代码
也许,最好的办法就是不这样做。

【讨论】:

  • 第一段实际上回答了我的问题,谢谢。我不知道基于返回类型会禁止链式调用,但它确实有道理。
  • @HoodedDeath 我很高兴它成功了。有一件事要提:这不像是不允许的。链接假定您在返回类型上调用方法(或扩展方法)。因此,Trim() 返回string,因此您可以将调用链接到stringToLower() 返回string,因此您可以将调用链接到stringSplit() 返回一个数组,因此您可以将调用链接到数组或 IEnumerable 下一个如果需要。如果您必须对其返回类型 (DialogResult) 进行某些操作,或者如果它返回原始对话框本身,您将能够使用 ShowDialog 链接调用。
  • 以这种方式考虑它实际上很有意义。我没有考虑返回的类型,我更多地考虑“运行此函数,忽略结果并继续”,但这对于链接 ToLower 和 Trim 而言毫无意义。谢谢你的回答。
【解决方案2】:

我相当有信心,没有一个模态对话框不能以这种方式工作。虽然您可以说:

var foo = new OpenFileDialog().ShowDialog();

结果是DialogResult,而不是您要查找的文件名属性。此外,您将不再拥有对实际 FileDialog 对象的引用,并且无论如何都无法提取所选文件名。

您可以使用的一种替代方法是创建一种方法,使其“看起来”像您正在通过一次调用执行此操作:

public static string GetFilename()
{
    var dlg = new OpenFileDialog();
    var result = dlg.ShowDialog();
    var filename = dlg.FileName;

    return filename;
}

public static void Main()
{
    var userChosenFile = GetFilename();
    var aDifferentChosenFile = GetFilename();
    var yetAnotherChosenFile = GetFilename();
}

【讨论】:

  • 像 Yeldar 的回答这样的扩展方法也可以。这完全取决于您希望代码的外观/阅读方式以及您是否必须经常这样做。
猜你喜欢
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多