2

整数のみを受け入れ、35 以下の数値のみを受け入れるように WPF テキストボックスを制限するために、次のように記述しました。

WindowLoaded イベントで、「OnPaste」のハンドラーを作成します。

DataObject.AddPastingHandler(textBoxWorkflowCount, OnPaste);

OnPaste は以下で構成されます。

private void OnPaste(object sender, DataObjectPastingEventArgs e)
{
    if (!IsNumeric(e.Source.ToString(), NumberStyles.Integer)) e.Handled = true;
}

数値のみを強制する関数は次のとおりです。

public bool IsNumeric(string val, NumberStyles numberStyle)
{
    double result;
    return double.TryParse(val, numberStyle, CultureInfo.CurrentCulture, out result);
}

エラーが発生している特定のテキスト ボックスも、35 以下の数値に制限する必要があります。これを行うために、次の TextChanged イベントを追加しました。

private void TextBoxWorkflowCountTextChanged(object sender, TextChangedEventArgs e)
        {
            try
            {
                if (textBoxWorkflowCount == null || textBoxWorkflowCount.Text == string.Empty || Convert.ToInt32(textBoxWorkflowCount.Text) <= 35) return;
                MessageBox.Show("Number of workflow errors on one submission cannot be greater then 35.", "Workflow Count too high", MessageBoxButton.OK, MessageBoxImage.Warning);
                textBoxWorkflowCount.Text = "";
            }
            catch(Exception)
            {
                // todo: Oh the horror! SPAGHETTI! Must fix. Temporarily here to stop 'pasting of varchar' bug
                if (textBoxWorkflowCount != null) textBoxWorkflowCount.Text = "";
            }

        }

これは仕事をしてうまくいきますが、それは非常に厄介/ハックであり、自分自身を改善するためにどうすればもっとうまくできるか知りたいです...特に例外を飲み込む必要はありません.

4

2 に答える 2

1

これはあなたのために働きますか?の内容を次のように置き換えますTextBoxWorkflowCountTextChanged

if (textBoxWorkflowCount == null || textBoxWorkflowCount.Text == string.Empty) return;
int workflowcount = 36;
if (int.TryParse(textBoxWorkflowCount.Text, out workflowcount) && workflowcount > 35) {
    MessageBox.Show("Number of workflow errors on one submission cannot be greater then 35.", "Workflow Count too high", MessageBoxButton.OK, MessageBoxImage.Warning);
    textBoxWorkflowCount.Text = "";
}
else if (workflowcount == 36) {
    textBoxWorkflowCount.Text = "";
}
于 2012-08-14T03:54:12.743 に答える
1

QtotheCに基づいて、もう少しリファクタリングした後、次の回答にたどり着きました。将来の訪問者のためにここに追加します:)

    private void TextBoxWorkflowCountTextChanged(object sender, TextChangedEventArgs e)
    {
        if (string.IsNullOrEmpty(textBoxWorkflowCount.Text))
            return;

        int workflowCount;

        if (!int.TryParse(textBoxWorkflowCount.Text, out workflowCount) || workflowCount <= 35) return;
        MessageBox.Show("Number of workflow errors on one submission cannot be greater then 35.", "Workflow Count too high",
                        MessageBoxButton.OK, MessageBoxImage.Warning);
        textBoxWorkflowCount.Text = "35";
    }
于 2012-08-14T04:07:26.120 に答える