2

私はC#を初めて使用し、プログラムをVB.netからC#に変換していると言って、この前置きをしましょう。

私はで働いてVisual Studio 2012実行していますSQL Server 2008R2

OK、フォーム1があります。このフォームには、ユーザーが入力できるテキストボックスTextBox1があります。ここで、テキストボックス内の情報を変数として使用して、データベースから情報を取得し、別のフォーム(form2)にテキストボックス(textbox2)を入力します。これはフォーム2で現在使用しているコードです。

    private void form2_Load(object sender, EventArgs e)
    {

        string Name = Form1.TextBox1.Text;
        this.TBMainTableAdapter.FillBy(Name);

    }

私も次のようにロードしてみました:

this.TBMainTableAdapter.FillBy(Form1.TextBox1.Text);

これらは両方とも私に「非静的フィールドにはオブジェクト参照が必要です...エラー

VB.Netでは、はるかに簡単で、このようにコーディングしましたが、完全に機能しました。

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.TBMainTableAdapter.FillBy(Me.ProjectDataset.TBName, TextBoxName.Text)
End Sub

背後のコードに欠けているものはありますか?テキストボックスのコードを変更してみました

から

public System.Windows.Forms.TextBox TextBox1;

public static System.Windows.Forms.TextBox TextBox1;

これにより、変数をプルする際のエラーが解消されましたが、フォーム1のコードビハインドで、「インスタンスでアクセスできません。名前タイプを指定してください」というエラーがさらに発生しました。

コードビハインドのすべてのエラーを変更する価値はありますか?そしてもっと重要なのは、これを行う正しい方法ですか?


OKなので、これら2つを下に追加しました

public partial class Form1 : Form
Form1  form1;
public Form2(Form1 frm)

    {    
        form1 = frm;
    }

    Form2 frm = new Form1(this);

「パブリックForm2(Form1 frm)」行で「メソッドには戻り型エラーが必要」が表示され、Form2で「エラーNamespace.Form1には1つの引数を取るコンストラクターがありません」が表示されます。frm= new Form1(this); ライン

また、getterプロパティをForm1に配置すると、同じ名前の2つのオブジェクトを宣言する際にエラーが発生します。TextBox1を宣言する場所を見つけることはできません。ただし、コードビハインドで宣言されているコードビハインドを除きます。

public System.Windows.Forms.TextBox TxtBox1

その下にゲッターを置くと、ステートメントエラーとして使用できる代入や呼び出しなどのみが取得されます

4

2 に答える 2

2

Form1のコントロールのコンテンツを使用するには、Form2オブジェクトにForm1への参照が必要です。さらに、textBox1をパブリックとして宣言するか、そのためのgetterプロパティを作成する必要があります。多くのことを使用できますが、Form1がForm2で必要な場合、最も簡単な方法は、Form1の参照をForm2のコンストラクターに渡すことです。

Form1 form1;
public Form2(Form1 frm)
{
    form1 = frm;
}

Form1にtextBox1のgetterプロパティを追加します。

public TextBox TextBox1
{
    get
    {
       this.textBox1;
    }
}

このコンストラクターは、次のようにForm1メソッドから呼び出すことができます。

From2 frm = new Form2(this);

そして、あなたは呼び出すことができます:

private void form2_Load(object sender, EventArgs e)
{

    string Name = form1.TextBox1.Text;
    this.TBMainTableAdapter.FillBy(Name);

}
于 2013-03-02T22:28:48.170 に答える
0

何かが足りないかもしれませんが、メソッドFillByは2つのパラメーターを取ります。1つ目はDataTable塗りつぶし、2つ目は、です。次のNameように変更します。

this.TBMainTableAdapter.FillBy(Me.ProjectDataset.TBName, Name);

1つのパラメータを持つメソッドはですTBMainTableAdapter.Fill(DataTable table)

編集:あなたがForm2を使用していることを見逃しましたが、TextBoxNikolaが指摘したように、これはForm1を使用しています。これは、もちろん重要な事実です。とにかく役立つかもしれないので、私はこの答えを保ちます。

于 2013-03-02T22:28:58.120 に答える