1

私はこのコードを思いつきました。これはかなり賢いと思いました (選択した日付が過去の場合、TextBox は読み取り専用にする必要があり、それ以外の場合 (今日の日付または将来の日付) は編集可能にする必要があります):

bool? setReadOnly = null;

if (SelectedDateIsInThePast() && (!currentlyReadOnly)) {
    setReadOnly = true;
} else if (!SelectedDateIsInThePast() && (currentlyReadOnly)) {
    setReadOnly = false;
}
if (setReadOnlyToTrue.HasValue) {
    foreach (Control ctrl in tableLayoutPanelPlatypus.Controls) {
        if (ctrl is TextBox) {
            tb = (TextBox)ctrl;
            tb.ReadOnly = setReadOnlyToTrue.Value;
        }
    }
}

...しかし、null 可能なブール値は、私の仲間の間で「データ型の非グラタ」であることがわかります。

同じことを行う複雑でない方法はありますか (読み取り専用値を変更する必要がある場合にのみ、コントロールをループしますか?)。もちろん、このように設定する必要があるかどうかに関係なく、単純に設定できます。

if (SelectedDateIsInThePast()) {
    setReadOnly = true;
} else {
    setReadOnly = false;
}
foreach (Control ctrl in tableLayoutPanelPlatypus.Controls) {
    if (ctrl is TextBox) {
        tb = (TextBox)ctrl;
        tb.ReadOnly = setReadOnly;
    }
}

...しかし、回避することが合理的に可能な場合、私は意味のない操作を実行するのは好きではありません。

4

5 に答える 5

3

ループをメソッドに分解し、設定した場合にのみメソッドを呼び出しますsetReadOnly

if (SelectedDateIsInThePast() && (!currentlyReadOnly)) {
    SetReadOnly(true);
} else if (!SelectedDateIsInThePast() && (currentlyReadOnly)) {
    SetReadOnly(false);
}
于 2012-05-16T16:17:16.553 に答える
1

|=、、および2つのnull許容でないブール値を使用&=して、同じ要件を実装できます。

bool forceReadOnly = SelectedDateIsInThePast() && (!currentlyReadOnly);
bool clearReadOnly = !(!SelectedDateIsInThePast() && (currentlyReadOnly));

foreach (Control ctrl in tableLayoutPanelPlatypus.Controls) {
    if (ctrl is TextBox) {
        tb = (TextBox)ctrl;
        tb.ReadOnly |= forceReadOnly;
        tb.ReadOnly &= clearReadOnly;
    }
}
于 2012-05-16T16:15:55.673 に答える
1

nullable bool は問題ないと思いますが、別の方法は次のとおりです。

public enum ControlState
{
    Unknown = 0,
    DateInPast,
    DateInFuture
}

....

var state = ControlState.Unknown;

if (SelectedDateIsInThePast() && (!currentlyReadOnly)) {
    state = ControlState.DateInPast;
} else if (!SelectedDateIsInThePast() && (currentlyReadOnly)) {
    state = ControlState.DateInFuture;
}
if (state != ControlState.Unknown) {
    foreach (Control ctrl in tableLayoutPanelPlatypus.Controls) {
        if (ctrl is TextBox) {
            tb = (TextBox)ctrl;
            tb.ReadOnly = setReadOnlyToTrue.Value;
        }
    }
}
于 2012-05-16T16:16:37.770 に答える
1

意味のある 3 つの状態を持つ列挙型を使用しますか?

enum ShouldSetState
{
    No, 
    SetReadOnly,
    SetReadable
}

それからする

ShouldSetState setState = ShouldSetState.No;

if (SelectedDateIsInThePast() && (!currentlyReadOnly)) {
    setState = ShouldSetState.SetReadOnly;
} else if (!SelectedDateIsInThePast() && (currentlyReadOnly)) {
    setState = ShouldSetState.SetReadable;
}
if (setState != ShouldSetState.No) {
    foreach (Control ctrl in tableLayoutPanelPlatypus.Controls) {
        if (ctrl is TextBox) {
            tb = (TextBox)ctrl;
            tb.ReadOnly = setState == ShouldSetState.SetReadOnly;
        }
    }
}
于 2012-05-16T16:17:23.677 に答える
0

nullable bool を使用せずに、コードをより簡潔にすることができます。

bool inThePast = SelectedDateIsInThePast();
if (currentlyReadOnly != inThePast )
{
    currentlyReadOnly = inThePast;
    foreach(var tb in tableLayoutPanelPlatypus.Controls.OfType<TextBox>())
        tb.ReadOnly = currentlyReadOnly;
}

また、これらの種類の UI 操作を多数行う必要がある場合は、データ バインディングを検討してください。

于 2012-05-16T16:37:01.077 に答える