2010-12-17 18 views
2

わかりましたように、私は.NETの初心者です。あるフォームのコントロールを別のフォームから参照したいだけです。別のフォームから1つのフォームのコントロールを参照する

通常、私はForm.Control.Propertyを実行しますが、それは機能しません。私がGoogleで見つけたすべての例は私のためには機能しません。それはちょうど、パブリッククラスと過度に複雑そうです

など

これを行うために、より簡単な方法はありますか?私はタオルを投げ込み、この時点でグローバル変数を使用する準備ができています。

私は参照したいコントロールを含むフォームを持っています、frmGenerateにはtxtCustomerNoというテキストボックスがあります。

このフォームからボタンのクリックイベントまで、私は別のフォームfrmCustomersを表示し、そのフォーム参照をtxtCustomerNoの値にします。

frmCustomers.ShowDialog() 

私はただ把握していない単純なものでなければなりません。

+1

コードを投稿できますか?あなたのアプローチは一般的に正しいと思われます。 – Oded

答えて

4

あなたが参照するコントロールをフォームに:あなたがコントロールを参照したいフォームで

Public Property CustomerNo() As TextBox 
    Get 
     Return txtCustomerNo 
    End Get 
    Set(ByVal Value As TextBox) 
     txtCustomerNo = Value 
    End Set 
End Property 

Dim CustomerNo as string = _sourceForm.CustomerNo.Text 

それがこれを行うには悪いデザインだが、それです最も簡単な方法 - あなたをあなたの方法で設定する必要があります。

テキストボックスに入力された値にのみ興味深いものなら、次は良いかもしれない:

Public ReadOnly Property CustomerNo() As String 
    Get 
     Return txtCustomerNo.Text 
    End Get 
End Property 

上記は、最初の形式の実際のインスタンスへの参照を持っている第二の形式が必要になります。第二の形式に以下の追加:

Private _sourceForm as frmGenerate 

Public Property SourceForm() As frmGenerate 
    Get 
     Return _sourceForm 
    End Get 
    Set(ByVal Value As frmGenerate) 
     _sourceForm = Value 
    End Set 
End Property 

今、あなたがあなたの第2の形態の作成と起動を扱うところ、次の操作を行うことができます

Dim customersForm as new frmCustomers 
customersForm.SourceForm = Me 
customersForm.Show()  

EDIT: 私はサンプルを構築しましたここにあなたのためのプロジェクト:

http://www.yourfilelink.com/get.php?fid=595015

+0

ねえ、私はそのコードを正確に追加し、 "非共有メンバーへの参照はオブジェクト参照が必要です"を得る。 frmGenerateのコード:Public ReadOnlyプロパティCustomerNo()As String返り値Me.txtCustomerNo.Text End Getプロパティを取得します。 frmCustomersのコードがダイアログとして開かれました。frmGenerate.CustomerNoはそのエラーを返します。それは私だけか、これは本当に過度に複雑な私は必要な終わりに達することですか? – Tom

+1

クラスのインスタンスではなくCLASSにアクセスしようとしています。そのため、「非共有メンバーへの参照」エラーが表示されます。名前を使ってフォームを単に呼び出すという旧式のVB6の方法を使用するのではなく、対象のフォームのインスタンスを作成します。私はDim frm =新しいMyForm、frm.whateverの代わりにMyForm.whateverという古い方法の代わりに... – DarinH

+0

これは簡単ですが、Dim frm = New frmGenerateとtxtCustomerNoを宣言すると、空白になります文字列。 – Tom

1

追加するプロパティがpublicであることを確認するか、他のクラスからアクセスできないようにする必要があります。

1

あなたがワットを作ることができるはずですあなたが公式の外で参照する必要があるものは何でも。多くの場合、そのすべてが必要です。

場合によっては、別のパブリックプロパティまたはメソッドを作成すると便利です。そして、この方法で詳細を管理してください。たとえば、テキストにアクセスできるようにするには、次のようなプロパティを作成します(C#)。

public string CustomerNo 
{ 
    get 
    { 
     return txtCustomerNo.Text; 
    } 
    set 
    { 
     txtCustomerNo.Text = value; 
    } 
} 
1

プライベートフィールドを作成します。 'Refactor'を右クリックし、 'Encapsulate Field'を選択します。これにより、フィールドのパブリックプロパティが自動的に作成されます。

もう1つの方法は、パブリックコンストラクタをオーバーロードすることです。

public CustomersForm(string property1, string property2...) 
{ 
    //Get the properties and do what is necessary. 
} 

//Parent Form 

CustomersForm frmCustomers = new CustomersForm(property1, property2..); 

また、完全なコントロールを別のフォームに送信するのは良い方法ではありません。パブリックプロパティ/コンストラクタを介して必要なフィールドのみを共有します。

0

2番目のフォームに必要なデータを返すプロパティを作成できますが、そのコントロールの修飾子プロパティも簡単に変更できます。既定では、コントロールの修飾子はプライベートなので、現在のフォーム以外にはアクセスできません。コントロールをクリックし、修飾子プロパティを見つけます。公衆にそれを設定し、あなたのような、フォームの外からアクセスできるようになります:

Dim f As New SecondForm 
f.FirstNameTextBox.Text = "Bob" 
1

これにアプローチするより良い方法は、あなたのクラスにコントロールの参照 を通過させることである、いずれかを変更そこにあなたのロジックと のプロパティは、 "呼び出し"フォームに戻って "送信"。

ここでのトリックは、クラスコードが呼び出されたクラスの "ByRef"引数を使用していることを確認することです。そうしないと、動作しません。 メモリ内では、同じコントロールを参照するために、新しい プロパティを作成せずに、コードクリープを軽減します。

たとえば、クラスコードからボタンを無効にする方法は次のとおりです。フォームで

、あなたのクラスを呼び出し、ボタン(または他のコントロール)を渡し:

' new the class your calling 
Dim CallClass As New ProgramCall 
' pass the control as a by reference argument 
CallClass .SetUpTheCall("HOURLY", btnSendToBank) 

次に、あなたのクラスで:

Public Sub SetUpTheCall(ByVal ParmToPass As String, ByRef btnSendToBank As Button) 

' your class logic goes here... 

' disable the send button on the calling form 
btnSendToBank.Enabled = False 

' change the button text on the calling form 
btnSendToBank.text = "Disabled" 
0

私は人の名前を保存このようにログインした後、次のフォームのテキストボックスにログインします。 私のログインボタンは、最後の行があります Me.Hide()(未Me.Close()) Admin.Show() エンド

ユーザが正しいユーザ名とパスワードを入力すると、ログインフォームを隠します(

薄暗いがString ログイン= Login.txtUser.Text Login.Closeとして記録:と私は入れて最後の行としてAdmin.vbページのAdmin_Loadでは、Admin.vb

を次のページを開きます)。 'Close hidden login.vb' End Sub

したがって、ユーザーはログインボタンを押して、txtUserテキストボックスに必要な値でログインフォームを非表示にします。その後、管理ページが開きます。管理ページのloadイベントは、txtUserテキストボックスの非表示ログインページから自分の値を取得し、それをパラメータ "logged"に格納します。 値を取得すると、ログインページを閉じてサブを終了します。それはすべて目の瞬きの中で起こる! どこでも私はログインした人の名前を使用したいと思う、私はちょうど「ログ」を使用するテキストボックスのように。

txtchangesby.Textは=

非常に簡単で、作品をログに記録しました。

1
My.Forms.frmGenerate.txtCustomerNo.Text 
+1

ようこそStackoverflowへ。仲間のプログラマーが理解できるように、あなたの答えをもう少し詳しく、問題を解決する方法を教えてください。 – Daenarys

関連する問題