Сохранение и загрузка строго типизированного набора данных из настроек

Я добавил в свой проект строго типизированный объект DataSet. Это имя типа DocRetrieverDataSet. У меня также есть в настройках моего проекта строка для свойства DataSet области пользователя с именем DocRetrieverDataSource, в котором я хочу сохранить экземпляр DocRetrieverDataSet.

Вот упрощённый код:

using Settings = MyProjectNameSpace.Properties.Settings;
....
private DocRetrieverDataSet myDocRetrieverDataSet;

public myForm()
{
    Initialize();
    if (Settings.Default.DocRetrieverDataSource == null)
    {
        Settings.Default.DocRetrieverDataSource = new DocRetrieverDataSet();
        Settings.Default.Save();
    }
    this.myDocRetrieverDataSet = (DocRetrieverDataSet)Settings.Default.DocRetrieverDataSource;
}

Первый раз запускаю, когда Settings.Default.DocRetrieverDataSource равно null, работает нормально! Однако, когда я запускаю его во второй раз, я получаю InvalidCastException в

this.myDocRetrieverDataSet = (DocRetrieverDataSet)Settings.Default.DocRetrieverDataSource;

Это говорит

Unable to cast object of type 'System.Data.DataSet' to type 'DocRetriever.DocRetrieverDataSet'.

Самое смешное, что с первого раза такой проблемы нет. Что происходит и как я могу это исправить?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: вот соответствующий код из Settings.Designer.cs.

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::System.Data.DataSet DocRetrieverDataSource {
    get {
        return ((global::System.Data.DataSet)(this["DocRetrieverDataSource"]));
    }
    set {
        this["DocRetrieverDataSource"] = value;
    }
}

И из app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=abcdefghijkl" >
            <section name="DocRetriever.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=abcdefghijkl" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <DocRetriever.Properties.Settings>
            <setting name="SpoolDirectoryPath" serializeAs="String">
                <value />
            </setting>
            <setting name="OutputDirectoryPath" serializeAs="String">
                <value />
            </setting>
        </DocRetriever.Properties.Settings>
    </userSettings>
</configuration>

person user2320861    schedule 17.04.2014    source источник


Ответы (1)


Вам нужно изменить кастинг в файле настроек с DataSet на DocRetrieverDataSet.

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::System.Data.DataSet DocRetrieverDataSource {
    get {
        return ((global::FullNamespace.DocRetrieverDataSet)(this["DocRetrieverDataSource"]));
    }
    set {
        this["DocRetrieverDataSource"] = value;
    }
}

Вы также можете сделать это с помощью дизайнера настроек, просто зайдите в свою собственность и найдите свой класс Setting Designer

person Yuval Itzchakov    schedule 17.04.2014
comment
Спасибо, кажется, я понимаю, что это пытается сделать, но это не работает. Я включу соответствующий раздел из Settings.Designer.cs и app.config, чтобы вы могли лучше указать мне, что мне нужно изменить. (Я никогда раньше не прикасался к app.config.) - person user2320861; 18.04.2014
comment
Когда я нажал «Обзор», я не смог перейти к своему классу, поэтому я попытался просто ввести DocRetriever.DocRetrieverDataSet в текстовое поле, и это сработало! - person user2320861; 19.04.2014