2017-01-26 1 views
0

ASP.netでタイムテーブルプログラムを作成しています。私はいくつかの助けが必要です。私が経験している問題は、ボタンのサブが終了し、画面が再びユーザーの入力のためにポップアップすると、すべての配列と変数が0または0に設定されていることです。VB.netでendサブの後に配列と変数がクリアされる

変数のすべての値サブの終わりにして後で使うのか?

ご協力いただければ幸いです。

Public Class PickTimesTables 
    Inherits System.Web.UI.Page 

    Dim count As Integer = 0 
    Dim NumberQ As Integer 
    Dim RandomN As Integer 
    Dim FirstNumber() As Integer 
    Dim FirstNumberTemp() As Integer 
    Dim SecondNumber() As Integer 
    Dim correctAnswers As Integer 
    Dim inc As Integer = 0 

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
     PanelQuestion.Visible = False 
     PanelAnalysis.Visible = False 
    End Sub 

    Protected Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click 
     PanelQuestion.Visible = True 
     lblOperator.Text = "X" 
     If chktimes1.Checked = False And chktimes2.Checked = False And chktimes3.Checked = False And chktimes4.Checked = False And chktimes5.Checked = False And chktimes6.Checked = False And chktimes7.Checked = False And chktimes8.Checked = False And chktimes9.Checked = False And chktimes10.Checked = False And chktimes11.Checked = False And chktimes12.Checked = False Then 
      MsgBox("Pick a Times Table to be Tested for..") 
     ElseIf txtNoQuestion.Text = "" Then 
      MsgBox("Pick the Number of Question for the test") 
     Else 
      NumberQ = txtNoQuestion.Text 
      count = 0 
      If chktimes1.Checked Then 
       count = count + 1 
      End If 
      If chktimes2.Checked Then 
       count = count + 1 
      End If 
      If chktimes3.Checked Then 
       count = count + 1 
      End If 
      If chktimes4.Checked Then 
       count = count + 1 
      End If 
      If chktimes5.Checked Then 
       count = count + 1 
      End If 
      If chktimes6.Checked Then 
       count = count + 1 
      End If 
      If chktimes7.Checked Then 
       count = count + 1 
      End If 
      If chktimes8.Checked Then 
       count = count + 1 
      End If 
      If chktimes9.Checked Then 
       count = count + 1 
      End If 
      If chktimes10.Checked Then 
       count = count + 1 
      End If 
      If chktimes11.Checked Then 
       count = count + 1 
      End If 
      If chktimes12.Checked Then 
       count = count + 1 
      End If 

      If txtNoQuestion.Text = 0 Then 
       MsgBox("You cannot have a test with 0 Questions") 
      Else 
       ReDim FirstNumberTemp(count - 1) 
       For i = 0 To count - 1 
        If chktimes1.Checked Then 
         FirstNumberTemp(i) = 1 
         chktimes1.Checked = False 
        ElseIf chktimes2.Checked Then 
         FirstNumberTemp(i) = 2 
         chktimes2.Checked = False 
        ElseIf chktimes3.Checked Then 
         FirstNumberTemp(i) = 3 
         chktimes3.Checked = False 
        ElseIf chktimes4.Checked Then 
         FirstNumberTemp(i) = 4 
         chktimes4.Checked = False 
        ElseIf chktimes5.Checked Then 
         FirstNumberTemp(i) = 5 
         chktimes5.Checked = False 
        ElseIf chktimes6.Checked Then 
         FirstNumberTemp(i) = 6 
         chktimes6.Checked = False 
        ElseIf chktimes7.Checked Then 
         FirstNumberTemp(i) = 7 
         chktimes7.Checked = False 
        ElseIf chktimes8.Checked Then 
         FirstNumberTemp(i) = 8 
         chktimes8.Checked = False 
        ElseIf chktimes9.Checked Then 
         FirstNumberTemp(i) = 9 
         chktimes9.Checked = False 
        ElseIf chktimes10.Checked Then 
         FirstNumberTemp(i) = 10 
         chktimes10.Checked = False 
        ElseIf chktimes11.Checked Then 
         FirstNumberTemp(i) = 11 
         chktimes11.Checked = False 
        ElseIf chktimes12.Checked Then 
         FirstNumberTemp(i) = 12 
         chktimes12.Checked = False 
        End If 
       Next 
       ReDim FirstNumber(NumberQ - 1) 
       For i = 0 To NumberQ - 1 
        Randomize() 
        RandomN = FirstNumberTemp(Int(Rnd() * count)) 
        FirstNumber(i) = RandomN 
       Next 

       ReDim SecondNumber(NumberQ - 1) 
       For i = 0 To NumberQ - 1 
        Dim rn As New Random(Now.Millisecond) 
        RandomN = rn.Next(1, 13) 
        SecondNumber(i) = RandomN 
       Next 

       lblFirstN.Text = FirstNumber(0) 
       lblSecondN.Text = SecondNumber(0) 
      End If 
     End If 
    End Sub 

    Protected Sub txtInput_TextChanged(sender As Object, e As EventArgs) Handles txtInput.TextChanged 
     NumberQ = txtNoQuestion.Text 
     If txtInput.Text = FirstNumber(inc) * SecondNumber(inc) Then 
      lblFirstN.Text = FirstNumber(inc + 1) 
      lblSecondN.Text = SecondNumber(inc + 1) 
      correctAnswers = correctAnswers + 1 
      txtInput.BackColor = Drawing.Color.Green 
     Else 
      txtInput.BackColor = Drawing.Color.Red 
      lblFirstN.Text = FirstNumber(inc + 1) 
      lblSecondN.Text = SecondNumber(inc + 1) 
     End If 
    End Sub 
End Class 

答えて

0

これは、ASP.Net Webformsの新入社員にとってよくある間違いです。あなたのページクラスのインスタンスは、ブラウザ内のページとのユーザーのすべてのやりとりのために、セッション全体にわたって存在するという考えがあります。 これは起こりません。イベントを発生させるページとのやり取りは、クライアントからサーバーへの新しいポストバックを作成し、すべてのポストバックは、ページクラスの新しいインスタンスを使用します。ユーザーがブラウザで自分のページを見るまでに、そのビューのHTMLをレンダリングするために使用したどのページオブジェクトも既に破棄されてガベージコレクションされています。

Session、URL、またはViewStateに変数を入れるなど、これを回避するためにできることがいくつかありますが、ウェブサイトにとってより自然なものへのアプローチを完全に再考する必要があることがよくあります。

さらに、VB.NetコードでTextChangedイベントを処理することを再考する必要があります。一般的に言えば、TextChangedイベントは25〜40ミリ秒でユーザーに返される必要があります。そうしないと、ビューが極端に遅く感じられます。プログラムがユーザーのコンピュータ上ですぐに実行され、そのワークステーションのすべてのメモリとCPU能力が利用可能な場合、通常は問題にはなりません。それはウェブサイトにとってはまったく別の話です。要求がサーバーに到達するまでに80msの遅延があり、応答を処理する前に80msの遅延があり、サーバーがそれを共有するCPUとメモリのリソースを共有していますユーザーはあなたが適合することができます。

代わりに、その処理のためにjavascriptイベントを使用して、ユーザーが最終的に最終結果を送信または保存しようとするときにVB.Netコードのテキストのみを検証します。

最後に、MsgBox()関数への呼び出しも必要です。あなたのWebサーバーがWebブラウザと同じマシン上にあるため、あなたのシステムでのみ動作するようです。実際にこれを実際のサーバーに置き、別の場所からテストすると、それらのメッセージはサーバー上にではなく、ユーザーのWebブラウザーのと表示されます。

+0

申し訳ありませんが、私はあなたのスキルをテストできるようにする乗算プログラムをやっています。最初の方程式を出力し、ユーザーが答えを入力できるようにするプログラムが必要になります。これにより、textchangedハンドラが起動され、計算が実行されます。 textchangedハンドラを使用せずにこれを行う別の方法がありますか? – alanSmirnov

+0

JavaScriptでその部分を行う –

0

これはウェブのステートレスな性質のためリセットされます。後でそのページを表示したり、デバッガを使用してページを表示したりするたびに、新しい値を要求するため、値を保持しません。

ViewStateまたはSessionにasp.net変数を格納する、つまりViewStateでサポートされているプロパティをGoogleに保存する必要があります。

関連する問題