2016-07-18 17 views
0

私のプログラムでは、ボタンを使って設定を保存することができます。店舗は機能します。設定をロードしても正しく動作しません。ルールを読み込む際に問題があります。私はリストとしていくつかのルールを持っています。私はインデックスを指定する方法を知らない。誰でも助けてくれますか?C#winフォームでXMLファイルをロードする

方法は、保存/設定をロードします

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; 
    } 

私の英語はあまりよくないですが、私はそれが理解を願っています。

+0

SaveUserConfigメソッドとLoadUserConfigメソッドを表示できますか?さらに、_rules [5]を使用してComboBox.Selected項目をロードし、UserConfigからプロパティをロードしないようにしてください。 –

+0

'_rules'とは何ですか?あなたがそれが問題だと言う行は、あなたがそれに言及した最初のことです。 – Bridge

+0

'SelectedItem'ではなく' SelectRulesComboBox.SelectedIndex'を意味していませんか? – Bridge

答えて

2

あなたはSelectRulesComboBoxで選択するルールの名前であり、ルールの各インスタンスは、_rulesコレクション内userConfig.Ruleのインデックスを見つけることである何をする必要Nameという名前のプロパティを持っています。

_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でルールが見つからなかった場合、上記のコードは例外をスローすることに注意してください。

0

なぜデータテーブルを使用しないでください& 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; 
     } 
    } 
} 

編集:それは最適な方法ではないのですが、それはあなたが始めることができます。ナフ氏によると、xmlのデータを検証しているすべてのブロックを常に試してみてください。ユーザの入力は信用できません。 userConfig.Ruleを想定し

関連する問題