2016-09-16 5 views
0

WPFアプリケーションで複数のチェックボックスをチェックし、それに応じてコードブロックを実行するかどうかを確認する必要がある状況があります。コードブロックのすべての反復で変更される唯一のものはファイル名です。サンプルコードは次のようになります動的C#メソッドまたは複数のIf-else-ifブロック?

if(checkbox1.IsChecked == true) 
{ 
    Code(fileName1); 
} 
if(checkbox2.IsChecked == true) 
{ 
    Code(fileName2); 
} 
if(checkbox3.IsChecked == true) 
{ 
    Code(fileName3); 
} 

すべてが冗長に見えます。また、メソッドを作成してファイル名とチェックボックス名を渡すことはできません。チェックボックスは文字列として渡され、IsCheckedプロパティは文字列に対して無効になります。これを克服し、コードをきれいにする方法はありますか?

+0

あなたは何かが==、それは 'と同じtrue'のだ'と言います何か?それは通常、より読みやすくします。 –

+0

ポイントが記載されています。しかし、(checkBox1.IsChecked == true)if(checkBox1.IsChecked)に変更しても、それは同じエラーを返すでしょうか? –

+0

はい、これは同等のステートメントで、読みやすさだけです。 –

答えて

3

:最後に、このようなもので、あなたの質問からコードを置き換えます辞書にチェックボックスアップ、そしてそれらをループ:

var filesByCheckbox = new Dictionary<CheckBox, string> { 
    { checkbox1, filename1 }, 
    { checkbox2, filename2 }, 
    { checkbox3, filename3 } 
}; 

foreach (var kvp in filesByCheckbox) 
{ 
    if (kvp.Key.IsChecked) 
    { 
     Code(kvp.Value); 
    } 
} 

これは本当に何を改善していないが、それはちょうどそうリストに追加することが一つだけあるファイルに添付されているチェックボックスそれは少し明確になります行の代わりに3行。

それがあなたのために働くなら、タナーの答え。

+0

私はあなたのソリューションを実装していたとき、私は別のアイデアを得ました。なぜすべてのアクティビティを実行するメソッドを作成し、そのメソッドにCheckBox型のオブジェクトを引数として渡すのはなぜですか?それは多くの意味があります。ではない ? –

1

CheckBoxのサブクラスを使用するようにフォームを変更できますか?もしそうなら、あなたはこれを行うことができます:

class MyCheckBox : CheckBox 
{ 
    public string FileName { get; set; } 

    public void MyMethod() 
    { 
     if (IsChecked) 
     { 
      (do something with FileName); 
     } 
    } 
} 

を次にフォームデザイナでFileNameの値を設定します。あなたは手動であなたが今それを持っているのと同じ方法を文字列にチェックボックスをリンクする必要がある、とだけ短いコードを探しているなら、あなたがラップすることができ

checkbox1.MyMethod(); 
checkbox2.MyMethod(); 
checkbox3.MyMethod(); 
+0

このように見えます。 –

+0

私はC#の初心者ですが、私はあなたの提案されたソリューションから始めようとしました。私は新しいクラスCustomCheckBoxを作成し、CustomCheckBox:CheckBoxを使用してCheckBoxから継承しました。理想的には、CustomCheckBoxはCheckBoxのすべてのプロパティを複製する必要がありますか? XAMLを更新してCheckBoxをCustomCheckBoxに置き換えると、エラーがスローされ、WPFプロジェクトでCustomCheckBoxがサポートされていないことが示されます。なぜこれが起こっていますか? CheckBoxとCustomCheckBoxは同様のオブジェクトです –

+0

残念ながら、私はWPFに慣れていないので、その答えはわかりません。このページはあなたを助けるかもしれません:http://stackoverflow.com/questions/13351652/how-to-use-ac-sharp-custom-subclass-in-xamlしかし、あなたがJoe EnosのソリューションあなたがJoeのソリューションを実装していると思ったアイデア - 私はそれが良いアイデアだったと思う)。 –

1

チェックボックスをファイル名にマップする必要があります。簡単な方法は、Tagプロパティを使用することです:

checkbox1.Tag = filename1; 
checkbox2.Tag = filename2; 
checkbox3.Tag = filename3; 

次に配列やプロセスにyoutはチェックボックスを置く:

var checkboxes = new [] { checkbox1, checkbox2, checkbox3 }; 

foreach (var checkbox in checkboxes.Where(cb => cb.IsChecked)) 
{ 
    Code((string)checkbox.Tag); 
} 
関連する問題