2012-02-04 12 views
1

submitボタンを押すと、入力したデータがgroupFormのテキストボックスに表示されますが、これは起こっていません。フォームを再起動するか、データが表示されるように「リフレッシュ」ボタンを押す必要があります。form2が開いているときにform1のコントロールが更新されない

enter image description here

UPDATE

私はこの問題にでゾーニング。

フォームに引数を渡して、どのグループのデータを表示するかを知る必要があります。

このようなフォームを開くと、入力したデータはきれいに表示されます。

form_addNewProfitObject.Show() 

このようにして、フォームにはデータを追加するグループがわかりません。回避策はありますか?私はまた、の代わりにfrmReceiver.Show()をしようとしましたが、違いはありません。私は私が使用している方法が機能しない理由全くわからないんだけど

...多分それはので、それはgroupForm.NewProfitObjectsItem(ByVal *snip*)を呼び出し、groupFormnewを使用して作成された場合、これは動作しません「提出」打つ時ですか?

ENDのUPDATE

ここではフォームのナンバーワン(groupForm.vb)に 'リフレッシュ' ボタンを押すためのコードです。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    populate(Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID)) 
End Sub 

そして、ここでは(最後に)そのまったく同じ機能が、からform_addNewProfitObject.vbを呼び出す送信ボタン、用のコードです。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Try 

     Dim groupID As Integer = theGroupID 
     'New ProfitObject 
     ReDim Preserve Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects.Length) 
     Dim ProfitObjectID As Integer = Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects.Length - 2 
     Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID) = New ProfitObject 
     'Set ProfitObject properties 
     'Set ID 
     Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).id = ProfitObjectID 
     'Set Name 
     Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).name = TextBox1.Text 
     'Set Profit 
     Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).profit = TextBox2.Text 
     'Set TypeID 
     Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).typeID = TextBox3.Text 
     'Set Rarityd 
     Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).rarity = TextBox4.Text 
     'populate(Form1.main.Groups(groupID)) 
     Dim textt As String = "ID" & ProfitObjectID.ToString 
     groupForm.NewProfitObjectsItem(textt, Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).name, Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).profit, Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).rarity, Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).typeID) 

     groupForm.populate(Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID)) 

    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

    groupForm.Refresh() 
    Me.Close() 
End Sub 

だけProfitObjectsアレイ内のすべてのアイテムにわたってループし、NewProfitObjectsItemを呼び出し「移入」(Iは、テスト目的のために後者の機能の終了時にgroupForm.populate()を追加し、私はそれを必要とすべきではない知っていますそれぞれについて)。

とにかく; 2番目のフォームからデータを送信すると、groupFormは自動的に新しいデータを表示しません。私は、リフレッシュボタンを押すか、フォームを再起動する必要があります(フォームロード時にpopulate()を呼び出す)。

新しいアイテムを送信した直後に表示したいだけです。そしてそれは、groupForm.NewProfitObjectsItem()がそうしているからです。そしてそれを打ち消すために、私はgroupForm.populate()を追加しました。私はそれが外部のフォームから呼び出されているため、または他のフォームが開いている/フォーカスを持っているので、それが動作していないと仮定しています..任意のアイデア?

+0

フォームクラスではなくファイル名を変更したようです。 'Form1'とは何ですか? –

+0

@ OlivierJacot-Descombes Form1はこれとは無関係です。 – natli

+0

'Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects(ProfitObjectID)'。あなたがそれを書いたときにベビーシールが死んだ。どのようにしてそのようになったのか、リバースエンジニアリングするのは非常に難しい。修理する。 –

答えて

1

原因を突き止めた。 「groupForm」と表示する&を作成するためにNewを使用していたので、groupForm.NewProfitObjectsItemを呼び出すと、「form_addNewProfitObject」は正しいフォームにコントロールを追加していませんでした。

Public frmReceiver As New groupFormCGroupMainクラスに移動して、form_addNewProfitObjectがこのようにアクセスできるようにしなければなりませんでした。 Form1.main.Groups(theMainGroupID).frmReceiver.NewProfitObjectsItem

submitを打つと、コントロールが正しくgroupFormに追加されるようになりました。

2

あなたのコードに何が問題なのか分かりません。おそらく、デバッガを使用してバグを見つけることができます。 "Submit"ボタンの最初の行にブレークポイントを設定し、サブルーチンをクリックして、プロセスをステップごとに進めます。何が起こっているのか理解するのに役立つかもしれません。

私には疑わしい1点は、ReDimProfitObjectsと同じサイズの配列です。これにより、新しい配列が作成されます。他のフォームが

Dim a = Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID).ProfitObjects 

ReDim前に、この配列への参照を設定している場合、それはReDimmedだった前に続いて、この変数aはまだ古い配列を指すでしょう!


何かが全く異なります。コメントでは、コードをリファクタリングする必要があると言われました。私はこの意味でいくつかのリファクタリングを行った。これははるかに良く見えませんか?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Try 
     Dim groupID As Integer = theGroupID 
     Dim groupObject As GroupObject = Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID) 

     'New ProfitObject 
     ReDim Preserve groupObject.ProfitObjects(groupObject.ProfitObjects.Length) 

     Dim ProfitObjectID As Integer = groupObject.ProfitObjects.Length - 2 
     Dim profit As ProfitObject = New ProfitObject() 
     groupObject.ProfitObjects(ProfitObjectID) = profit 

     'Set ProfitObject properties 
     profit.id = ProfitObjectID 
     profit.name = TextBox1.Text 
     profit.profit = TextBox2.Text 
     profit.typeID = TextBox3.Text 
     profit.rarity = TextBox4.Text 

     'populate(Form1.main.Groups(groupID)) 
     Dim textt As String = "ID" & ProfitObjectID 
     groupForm.NewProfitObjectsItem(textt, profit.name, profit.profit, profit.rarity, profit.typeID) 

     groupForm.populate(groupObject) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

    groupForm.Refresh() 
    Me.Close() 
End Sub 

次にあなたが

'populate(Form1.main.Groups(groupID)) 
groupForm.NewProfitObjectsItem(profit) 

は(ここでは、追加の改行付き)

'populate(Form1.main.Groups(groupID)) 
Dim textt As String = "ID" & ProfitObjectID.ToString 
groupForm.NewProfitObjectsItem(textt, Form1.main.Groups(theMainGroupID) _ 
    .GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).name, _ 
    Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID) _ 
    .ProfitObjects(ProfitObjectID).profit, Form1.main.Groups(theMainGroupID) _ 
    .GroupObjects(theGroupID).ProfitObjects(ProfitObjectID).rarity, _ 
    Form1.main.Groups(theMainGroupID).GroupObjects(theGroupID) _ 
    .ProfitObjects(ProfitObjectID).typeID)      
を元を覚えて、さらにコールを簡素化することができます NewProfitObjectsItem

このような
Public Sub NewProfitObjectsItem(ByVal profit As ProfitObject) 
    Dim textt As String = "ID" & profit.id 
    '... 
End Sub 

のパラメータリストを簡素化


もう1つ。 form.ShowDialog()はブロッキングコールです。これは、フォームが閉じられるまで、この時点でコードが継続しないことを意味します。複数のフォームを同時に使用している場合は、間違いなくform.Show()を使用してください。

+0

コードをリファクタリングすることの意味を明確にすることに感謝します。それは間違いなくそれをより読みやすくします。あなたが言ったように、それは私が今考え出した問題には関係しません。私はこの問題を解決していないので自分の答えを追加して選択する必要がありますが、それでもあなたの時間をありがとう、それはまだ貴重な教訓です。 – natli

関連する問題