2

Form1というフォームがあります。その中に、暗号化と呼ばれるボタンがあります。そのボタンを押すと、別のクラスのメソッドを呼び出します。そのメソッドでtextBox1.textの値を変更したいのですが、このコードを使用しても何も起こりません

Form1クラスで

public string txtbox1
    {
        get
        {
            return textBox1.Text;
        }

        set
        {
            textBox1.Text = value;
        }
    }

他のクラスのメソッドで

Form1 textboxes = new Form1();//creating object of the Form1 class
        textboxes.txtbox1= "whatever";

最初のテキストボックスには何も変更されていません。何も押さないみたい!!!

どんな助けでも大歓迎です

4

5 に答える 5

6

他のクラスでは、新しいフォームではなく、ボタンがクリックされた(そして既存のテキストボックスがある)フォームへの参照が必要です。

インスタンス化するこの新しいフォームは、ボタンをクリックした画面で表示しているものではありません。

(イベントハンドラーがForm1クラス内に存在し、必要に応じて他のクラスのメソッドに情報を「転送」すると仮定しますか?そうでない場合は...そうする必要があります!)

senderボタン参照は、オブジェクトを介して取得できevent args、イベントハンドラーに渡されます。キーワードを他のクラスのメソッドに渡すことで、現在のForm1インスタンスへの参照を渡すことができます。thisまたは、senderifが役立つ場合は渡すか、特定のテキストボックスへの明示的な参照を他のメソッドに渡すことができます。

たとえば、フォームへの参照を他のメソッドに渡すには、次のようにします。

// Event handler on your form
private void button1_Click(object sender, EventArgs e)
{
    ButtonWasPressedOnForm(this);   
}

// Other method in your other class
public void ButtonWasPressedOnForm(Form formWhereButtonPressed)
{
    // To act on the text box directly:
    TextBox textBoxToUpdate = (TextBox)formWhereButtonPressed.Controls.Find("textBox1");
    textBoxToUpdate.Text = "whatever";

    // Or, using the Form1.txtBox1 property.
    formWhereButtonPressed.txtBox1 = "whatever";  
}

たとえば、明示的なテキストボックスへの参照を他のメソッドに渡すには:

// Event handler on your form
private void button1_Click(object sender, EventArgs e)
{
    ButtonWasPressedOnForm(textBox1);   
}

// Other method in your other class
public void ButtonWasPressedOnForm(TextBox textBoxToUpdate)
{
    textBoxToUpdate.Text = "whatever";
}

たとえば、イベントオブジェクトを他のメソッドに渡すには:

// Event handler on your form
private void button1_Click(object sender, EventArgs e)
{
    Button clickedButton = (Button)sender;
    ButtonWasPressedOnForm(clickedButton);  
}

// Other method in your other class
public void ButtonWasPressedOnForm(Button clickedButton)
{
    Form theParentForm = clickedButton.FindForm();

    // To act on the text box directly:
    TextBox textBoxToUpdate = (TextBox)theParentForm.Controls.Find("textBox1");
    textBoxToUpdate.Text = "whatever";

    // Or, To act on the text box, via the form's property:
    theParentForm.txtBox1 = "whatever";
}

また、このコードが実行されるように、「他のメソッド」にブレークポイントを設定します。そうでない場合は、イベントハンドラーに戻り、それが発生していることを確認します。そうでない場合は、イベントのワイヤアップを確認してください。


すべての場合において、更新するコントロールの保護レベルに注意する必要がありますが、フォームと他のクラスとの関係に応じて、パブリック、内部、または保護する必要があります。Form1クラス外から更新したい。

より良いオブジェクト指向アプローチは、Form1他のクラスがForm1それらのコントロールを更新するように指示できるようにするメソッドを持つことです(例えばupdateTextBox(string newText))。OOのベストプラクティスではないため、外部オブジェクトがクラスのメンバーに直接作用することを許可します(これには、クラスの内部構造の知識が必要です...これは、既存のインターフェイスを壊すことなく実装を変更できるようにカプセル化する必要があります)あなたのクラスと外の世界の間)。

編集: 実際、質問を読み直すと、get/setプロパティを使用してテキストボックスを既にカプセル化しています。良い。したがって、フォームへの参照を他のメソッドに渡してから、プロパティを介してフォームのテキストを更新する必要があります。上記の例にこのメソッドを追加しました。

于 2012-10-14T04:03:26.867 に答える
3

これを行う簡単な方法を見つけました。最初にクラスに TextBox を作成します

class class1
   {
   public static TextBox txt1=new TextBox();
   public static void Hello()
     {
      txt1.Text="Hello";
     }
   }

form1にはボタン(button1)とテキストボックス(textBox1)があります。OK、今あなたの目的のテキストボックスのアドレスをコピーしてください変更する必要があります私はそれをテストしました、それは正しく動作します

public partial class Form1 : Form
{
 public Form1()
    {
     InitializeComponent();  
    }
 private void button1_Click(object sender, EventArgs e)
     {
      class1.txt1=textBox1;
      class1.Hello();
     }
}
于 2013-02-25T15:04:38.977 に答える
1

また、Form1クラスはどのような保護レベルですか?ここで私はよく問題を抱えています...クラスが公開されていないと、クラス外のクラスからアクセスできないことを忘れています。「保護」も使用できますが、2つのクラスの関係によって異なります。

于 2012-10-14T04:05:08.357 に答える
0

このような状況で、あるフォームから別のフォームに情報を渡すことは、フォーム自体ではなくクラスファイルに情報を保持することであることがわかりました

フォーム 1 の例:

public partial class customerHistory : Form
{
    private string passtexboxvaluetoclass = "";   


    // load class dependant.cs
    dependents cls_dependents = new dependents();

    public customerHistory()
    {
        InitializeComponent();
    }

private void button1_Click(object sender, EventArgs e)
    {
        dependents.passtexboxvaluetoclass = textbox1.text;
        // load next form
    }

次に、2番目のフォームでform_loadを呼び出すだけです

label1.text = dependents.passtexboxvaluetoclass;

このようにして、大量の情報を呼び戻すことができます。それらはすべて、物理的なフォーム自体ではなく、クラス内に保存されるためです。

于 2012-10-14T04:07:23.530 に答える
0

クラスでイベントを作成し、フォームがそのイベントをサブスクライブし、更新するデータを UI に渡すことによってもこれを行うことができますEventArgs...

于 2012-10-14T06:05:02.073 に答える