1

在编程方面我仍然是初学者,这是我按照 C# 教程完成的一个小应用程序。

private void viewImagesToolStripMenuItem_Click(object sender, EventArgs e)
     {

string openedfile = "";

        openfd.Title = "Insert a text file";
        openfd.InitialDirectory = "C:";
        openfd.FileName = "";
        openfd.Filter = "text files|*.txt|word documents|*.doc|allfiles|*.*";


        if (openfd.ShowDialog() == DialogResult.Cancel)

        {
            MessageBox.Show("Operation canceled");
        }

        if (openfd.ShowDialog() != DialogResult.Cancel)

        {
            openedfile = openfd.FileName;
            richTextBox1.LoadFile(openedfile,RichTextBoxStreamType.PlainText);
        }

在执行此操作时,我注意到如果我更改同一个应用程序的代码顺序只需 2 行 -

   string openedfile = "";
   openedfile = openfd.FileName; 

像下面这样调试时会抛出这样的错误 - 空路径名是不合法的。

    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {


        openfd.Title = "Insert a text file";
        openfd.InitialDirectory = "C:";
        openfd.FileName = "";
        openfd.Filter = "text files|*.txt|word documents|*.doc|allfiles|*.*";

        **string openedfile = "";
        openedfile = openfd.FileName;**


        if (openfd.ShowDialog() == DialogResult.Cancel)

        {
            MessageBox.Show("Operation canceled");
        }

        if (openfd.ShowDialog() != DialogResult.Cancel)

        {

            richTextBox1.LoadFile(openedfile,RichTextBoxStreamType.PlainText);
        }

没有办法理解这些类型情况下的错误。对这样的应用程序进行编码的具体顺序是什么?

4

4 回答 4

2

好吧,这个想法很简单,您不能使用尚未初始化的变量。在你的情况下,同样的事情正在发生。在您的第一个代码中 opensfile = openfd.FileName; 显示对话框后正在执行。因此文件名正确。但在第二个opensfile = openfd.FileName; 在对话显示之前被初始化。由于没有对话,因此名称为空,因此会出错。

笔记。我没有以技术方式使用初始化词。

于 2013-05-10T07:23:33.140 回答
1

该行openedfile = openfd.FileName;不会绑定两个变量,它会将此时具有的值复制到.openfd.FileNameopenedfile

在您的第二个示例中,用户此时尚未选择文件,因此该值仍然为空("")。稍后选择的值openfd将被忽略。

编辑这就是你得到错误的原因Empty path name is not legal

于 2013-05-10T07:15:20.060 回答
1

我将继续猜测问题是if块外部的 openfd.FileName 调用(以及在检索之前),而 if 块仍在执行中,如果你愿意,openfd 是“保持打开状态”,所以您可以检索其结果。

当您离开 if 块时,您实际上是在说您已完成此对话框,请继续。

在您的代码中,您还显示了多个对话框并多次调用显示对话框,请考虑以下内容。

    if (openfd.ShowDialog() == DialogResult.OK)
    {
        pictureBox1.Image = Image.FromFile(openfd.FileName);
    }
    else
    {
        MessageBox.Show("Operation canceled");
    }

(更改为使用 dialogresult.ok 因为这很可能是您希望从对话框中收到的结果)

更新

对于您当前的应用程序,每次调用 ShowDialog() 都会打开一个新对话框。认为它类似于

MessageBox.Show("woo");
MessageBox.Show("hoo");

在上面,当第一个消息框关闭时,它将关闭对话框并继续处理第二个消息框(下一行代码),使用您的

if (openfd.ShowDialog() != DialogResult.Cancel)

if 语句仍在使用您的 showdialog,因此它被视为仍在使用中并且不会立即被处理掉。当 if 语句完成时,您的对话框将被视为可以处理

此外,您的应用程序中的错误与文件名路径无关,它试图加载一个没有名称的文件

于 2013-05-10T07:07:39.833 回答
0

我一般更喜欢这个:

private void viewImagesToolStripMenuItem_Click(object sender, EventArgs e)
 {

    DialogResult dr=openfd.ShowDialog();
    if(dr==DialogResult.Ok)
    {   
       richTextBox1.LoadFile(openfd.FileName,RichTextBoxStreamType.PlainText);           
    }
    else
    {
      MessageBox.Show("No file Selected!!");
    }

}
于 2013-05-10T07:50:40.253 回答