以C#形式加载XML文件

本文关键字:XML 文件 加载 | 更新日期: 2023-09-27 17:57:30

在我的程序中,用户可以用按钮保存设置。这家商店正常营业。加载设置不太正常。加载规则时出现问题。我列出了几条规则。我不知道如何指定索引。有人能帮我吗?

保存/加载设置的方法:

private void SaveUserConfigButton_Click(object sender, EventArgs e)
    {
        var userConfig = new UserConfig();
        userConfig.RandomPopulation = (int)_probability;
        userConfig.Rule = _gameOfLife.NextGenerationRule.RuleName;
        userConfig.Speed = _timer.Interval;
        userConfig.UseBoundary = _gameOfLife.UseBoundary;
        SaveUserConfig(userConfig);
    }
    private void MainForm_Load(object sender, EventArgs e)
    {
        var userConfig = LoadUserConfig(_path);
        InputRandomPopulationNumbericUpDown.Value = userConfig.RandomPopulation;
        SelectRulesComboBox.SelectedItem = _rules[5];  // <-- here is the problem
        SpeedTrackBar.Value = userConfig.Speed;
        BoundaryCheckBox.Checked = userConfig.UseBoundary;
    }

我的英语不太好,我希望可以理解。

以C#形式加载XML文件

假设userConfig.Rule是您想要在SelectRulesComboBox中选择的规则的名称,并且规则的每个实例都有一个名为Name的属性,那么您需要做的就是在_rules集合中找到userConfig.Rule的索引。

如果_rulesList<T>,则可以使用FindIndex方法:

SelectedRulesCombobox.SelectedIndex = _rules.FindIndex(r => r.Name == userConfig.Rule);

否则,您可以在_rules集合中将每个规则与其索引一起投影,并获得第一个具有Name == userConfig.Rule:的规则

SelectedRulesCombobox.SelectedIndex = _rules.Select((rule, index) => new
{
    Rule = rule,
    Index = index
})
.First(x => x.Rule.Name == userConfig.Rule)
.Index;

但请记住,如果没有找到Name == userConfig.Rule的规则,上面的代码将引发异常。

为什么不使用datatable&WriteXml和ReadXml?

void writeResults()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("configID");
    dt.Columns.Add("configValue");
    //Other code you want to add
    //Then add row for each setting
    Datarow r  = dt.NewRow();
    r["configID"]= "Speed"; //e.g. Speed  
    r["configValue"]=_timer.Interval.ToString();  
    dt.Rows.Add(r);
    // snip
    //then save datatable to file
    dt.TableName="UserConfigs";
    dt.WriteXml(@"filename_goes_here");
}

从文件中读取设置更容易:

void readSettings()
{
    DataTable dt = new DataTable();
    dt.ReadXml(@"filename_goes_here");
    for(int i = 0; i < dt.Rows.Count; i++)
    {
        switch(dt.Rows[i][0])
        {
            case "Speed":
                try
                {
                    _timer.Interval=Int32.Parse(dr.Rows[i][1]);
                }
                catch
                {
                    // we've got a problem !
                }
                break;
            default:break;
        }
    }
}

编辑:这不是最佳方式,但它可以让你开始。Nuff说:"总是尝试/捕捉验证xml数据的每一个块——永远不要相信用户的输入。"。