1

私はこの関数を に持っていて、同じ関数をなどForm1に使用したいのですが、各フォームで関数を複製する代わりに、すべての人がアクセスできるようにする方法はありますか? 新しいものを作成してフォームから関数を呼び出そうとしましたが、機能しません...Form2Form3Class : Form

public void tb_Leave(object sender, EventArgs e)
{
    if ((sender as TextBox).Text.Count() < (sender as TextBox).MaxLength)
        (sender as TextBox).Text = (sender as TextBox).Text.PadLeft((sender as TextBox).MaxLength, '0');
}

アップデート

回答ありがとうございます。問題なく動作しますが、X テキストボックスに同じ方法を使用したい場合はどうすればよいでしょうか? (tb_Leave 関数で行っていたように)

つまり、私の古いメソッドでは、X テキストボックスを選択して、leave イベントを関数に送信するだけです。ヘルパー クラス内で別のメソッドを呼び出すメソッドを作成する必要があると述べていますが、まだメソッドを作成する必要があります。すべてのフォーム内で、そのクラスを呼び出すのは正しいですか? ただし、すべてのヘルパー クラスを含む新しい .cs ファイルを作成するだけでよいため、実際にはあなたの回答は非常に役立ちます:)

更新 2 このメソッドの移行に問題があります

public static void TextBoxKeyDown(this TextBox tb, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Enter:
            case Keys.Add:
                e.SuppressKeyPress = true;
                processTabKey(true);
                break;
            case Keys.Decimal:
                if (tb.Tag == "importe")
                {
                    e.SuppressKeyPress = true;
                    processTabKey(true);
                }
                break;
            case Keys.Subtract:
                e.SuppressKeyPress = true;
                processTabKey(false);
                break;
        }
    }

もちろんprocessTabKey();、アクティブなフォームでのみ機能することはわかっていますが、Formクラス外で機能させるにはどうすればよいですか?

4

3 に答える 3

2

これは、コードの非常に単純化されたバージョンです。どこでも再利用できるメソッドを作成するには、単純な静的クラスを含む新しい Utility.cs ファイルを作成します。

namespace MyApp.Utilities
{
    public static class MyUtility
    {
        public static void PadForTextBox(TextBox tb)
        {
            if (tb.Text.Length < tb.MaxLength)
                tb.Text = tb.Text.PadLeft(tb.MaxLength, '0');
        }
    }
}

これで、クラスを定義した名前空間への参照を持つすべてのフォームからこのメソッドを呼び出すことができます。

public void tb_Leave(object sender, EventArgs e)
{
    Utility.PadForTextBox(sender as TextBox);
}

同じ結果を得るもう 1 つの洗練された方法は、TextBox の拡張メソッドを使用することです。

namespace MyApp.Utilities
{
    public static class TextBoxExtensions
    {
        public static void PadForTextBox(this TextBox tb)
        {
            if (tb.Text.Length < tb.MaxLength)
                tb.Text = tb.Text.PadLeft(tb.MaxLength, '0');
        }
    }
}

そしてそれを呼び出す

public void tb_Leave(object sender, EventArgs e)
{
    (sender as TextBox).PadForTextBox();
}

ちなみに、これらのメソッドを使用すると、キャストの醜いシーケンスも取り除くことができます。

もちろん、あなたの tb_Leave メソッドはイベント ハンドラーなので、テキスト ボックスにリンクする必要があります。
テキストボックスが作成されたフォームとは別に、アプリ内のすべてのテキストボックスに共通のテキストボックス イベント ハンドラーが必要な場合は、WinForm デザイナーに頼ることはできませんが、イベント ハンドラーを手動でテキスト ボックスに追加する必要があります。 InitializeComponent 呼び出しの直後のフォーム コンストラクター。全体として、このタスクはデザイナーに任せ、必要に応じて上記の 1 行を追加することを好みます。例えば:

InitializeComponent();
// connect the leave event for 3 textboxes to the same static method inside the
// MyUtility static class
textBox1.Leave+=MyUtility.PadEventForTextBox;
textBox2.Leave+=MyUtility.PadEventForTextBox;
textBox3.Leave+=MyUtility.PadEventForTextBox;

.....

public static void PadEventForTextBox(object sender, EventArgs e)
{
    TextBox tb=sender as TextBox;
    if (tb.Text.Length<tb.MaxLength)
        tb.Text=tb.Text.PadLeft(tb.MaxLength, '0');
}
于 2013-04-25T11:54:23.990 に答える
1

Helpers.cs ファイル (または好きなもの) を用意し、次のようなヘルパー メソッドを作成します。

Yournamespace.Helpers
{
    public string GetTextBoxText(TextBox sender)
    {
        if (sender.Text.Count() < sender.MaxLength)
        return sender.Text.PadLeft(sender.MaxLength, '0');
    }
}

次に、フォームに名前空間を含めて、これを使用します。

public void tb_Leave(object sender, EventArgs e)
{  
   TextBox textBox = sender as TextBox
   textBox.Text = GetTextBoxText(textBox);
}
于 2013-04-25T11:53:47.817 に答える