Использование SaveFileDialog в C # / .NET приводит к ошибке «Экземпляры абстрактного класса не могут быть созданы» - PullRequest
1 голос
/ 20 июня 2011

Поэтому я изо всех сил пытался создать кнопку «Сохранить» в моем приложении .NET. Кажется, я все делаю правильно, согласно моим исследованиям. Я имел в виду эту статью в качестве основного источника: http://msdn.microsoft.com/en-us/library/system.windows.forms.savefiledialog.aspx

Вот мой код метода в C #:

private void save2(object A_0, EventArgs A_1)
{
    Stream stream = new Stream();
    savefile2 = new SaveFileDialog();
    savefile2.InitialDirectory = @"C:\Program Files\Folder\";
    savefile2.Filter = "Text files (*.txt)|*.txt|Word files (*.doc)|*.doc";
    savefile2.FilterIndex = 1;
    savefile2.FileName = "*.txt";
    savefile2.Title = "Save Box Text";
    savefile2.OverwritePrompt = true;
    if (savefile2.ShowDialog() == DialogResult.OK)
    {
        stream = savefile2.OpenFile();
        if (stream != null)
        {
            stream.Close();
        }
    }
}

При запуске программы я нажимаю кнопку «Сохранить», чтобы посмотреть, откроется ли она диалоговое окно и выдает следующую ошибку:

"Экземпляры абстрактных классов не могут быть созданы."

Однако я не использую никаких абстрактных классов. Все классы находятся в .NET Framework. Итак, я застрял. Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

Как было упомянуто двумя предыдущими постерами, вы не можете вызывать new в классе Stream, потому что он абстрактный, вот компилирующая версия вашего кода для справки

    private SaveFileDialog savefile2;
    private void save2(object A_0, EventArgs A_1)
    {
        savefile2 = new SaveFileDialog
                        {
                            InitialDirectory = @"C:\Program Files\Folder\",
                            Filter = "Text files (*.txt)|*.txt|Word files (*.doc)|*.doc",
                            FilterIndex = 1,
                            FileName = "*.txt",
                            Title = "Save Box Text",
                            OverwritePrompt = true
                        };
        if (savefile2.ShowDialog() == DialogResult.OK)
        {
            using (FileStream stream = File.Open(savefile2.FileName, FileMode.OpenOrCreate))
            {
                //do stuff
            }
        }
    }

Обратите внимание, что это хорошая идея, чтобы обернуть ваши экземпляры потока в блок using () {}, чтобы убедиться, что они расположены правильно

0 голосов
/ 20 июня 2011

Проблема в том, что Stream является абстрактным классом, и поэтому не может быть создан, как вы сделали с Stream stream = new Stream();, измените эту строку на Stream stream;, и она должна работать.

0 голосов
/ 20 июня 2011

Класс Stream является абстрактным, для которого вы пытаетесь создать экземпляр в строке 1. На самом деле вы никогда не используете созданный там объект, поэтому просто либо не назначайте ничего дляв объявлении или присвойте ему null.

...