[保存]ツールバーボタンを備えたWin32フォームがあり、チェックボックスなどのいくつかのゾントロールがフォーム上にあるとします。次に、[保存]ボタンを有効/無効にするチェックボックスのonchangeイベントの1行コードを記述します。最初にチェックボックスが選択され、[保存]ボタンが無効になり、次にチェックボックスの選択が解除され、[保存]ボタンが有効になります...もう一度チェックボックスを選択すると、[保存]ボタンは引き続き有効になります...たとえば、TextBoxの場合も同様です。テキストが「Hi」であるとしましょう...「HiBye」に変更します。保存が有効になります...元の「Hi」に戻します。保存は有効のままです...使用できるモデルはありますか保存ボタンのこれらの間違った有効化/無効化を防ぎますか?
4 に答える
チェックボックスのイベントでいくつかのIF - ELSE
コードを書く必要があります。CheckedChanged
コントロールのプロパティ(チェックボックス)を調べて、現在の状態を確認しChecked
ます。はいの場合は、ボタンの有効なプロパティをtrueに設定し、そうでない場合はfalseに設定します。
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox2.Checked)
button1.Enabled = true;
else
button1.Enabled = false;
}
checkBox2
がチェックボックスbutton1
の名前であり、が[保存]ボタンの名前であると仮定します。
他のコントロールにも同じIFELSEロジックを使用できます。テキストボックスの値を設定するには、Textプロパティを使用します
TextBox1.Text="I am gonna try something now"l
編集:comecmeが提案したように、checboxに基づいてボタンを有効/無効にするだけの場合は、このようなIFelseブロックの代わりに1行で実行できます
button1.Enabled=checkBox2.Checked
最後に保存された状態を保存し、現在の状態を変更するたびに比較して、それらが同一であるかどうかを確認できます。その場合は、ボタンを無効にします。
これらの比較に費用がかかる場合は、保存する必要のあるすべてのフィールドのハッシュ値を計算し、最後に保存された状態のハッシュが現在の状態のハッシュと一致する場合にのみ適切な比較を行うことで、これをより効率的にすることができます。 。
私は、すべての制御状態のチェックと設定を1つのメソッドにまとめることを好みます。
private void UpdateControls()
{
saveButton.Enabled = checkBox1.Checked;
otherButton.Visible = checkBox2.Checked && textBox.Text.Length > 0;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
UpdateControls();
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
UpdateControls();
}
private void textBox_TextChanged(object sender, EventArgs e)
{
UpdateControls();
}
これは、状態を確認および設定する場所が1つしかないことを意味し、特に複雑なフォームがある場合に、何が起こっているのかをはるかに簡単に理解できるようになります。また、ブール変数を割り当てるときは、ifステートメントよりもブール式を好みます。これは、別のelseステートメント(忘れられる可能性があります)を記述しなくてもtrueとfalseの両方に対応できるためです。
チェックボックスでどこに行くのかわかりませんが、ブール変数を使用します。
private Boolean _canSave = false;
private Boolean CanSave
{
get { return _canSave; }
set
{
_canSave = value;
MenuSave.Enabled = value;
}
}
public void MenuSave_Click()
{
Save();
}
private void Save()
{
// do your thing
CanSave = false;
}
public void TextBox_TextChanged()
{
CanSave = true;
}
これは、テキストを元に戻すときに保存メニューを無効にすることを考慮していません。Save()
それが必要な場合は、メソッド内のテキストをプライベート変数に格納し、それをすべての現在のテキストと比較して、TextBox_TextChanged()
元のテキスト(つまり最後の保存以降)と比較した変更が発生したかどうかを判断する必要があります。