0

に値を追加できますがarray(0)、その後に値を追加すると、 の値がarray(1)クリアされarray(0)ます。配列を宣言して作成するために考えられるあらゆる方法を試しました。私のコードは次のようになります。

Dim aryEstimateInfo() As String = New String(7) {}

Private Sub wzrdEstimateWizard_NextButtonClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.WizardNavigationEventArgs) Handles wzrdEstimateWizard.NextButtonClick

    Select Case wzrdEstimateWizard.ActiveStepIndex
        Case 0 'first estimate wizard step
            aryEstimateInfo(0) = rad_lstVehicleType.SelectedItem.ToString

        Case 1 'second estimate wizard step
            Dim DamageZoneSelected As Boolean = False
            For Each cntrl As Control In pnlDamageZone.Controls
                If TypeOf cntrl Is RadioButton Then
                    Dim RadButton As RadioButton = cntrl
                    If RadButton.Checked Then
                        DamageZoneSelected = True
                        DamageZone = RadButton.Text.ToString
                        Exit For
                    Else
                        DamageZoneSelected = False
                    End If
                End If
            Next
            If DamageZoneSelected = True Then
                lblDamageZoneError.Visible = False
                aryEstimateInfo(1) = DamageZone
            Else
                'if no damage zone is selected a message is displayed
                wzrdEstimateWizard.ActiveStepIndex = 2
                wzrdEstimateWizard.ActiveStepIndex = 1
                lblDamageZoneError.Visible = True
            End If

        Case 2 'third estimate wizard step
            'assigns the number of dents to the estimate array
            aryEstimateInfo(2) = ddlNumberOfDents.SelectedValue.ToString
            'sets the average dent size  in the estimate arrau
            aryEstimateInfo(3) = ddlDentSize.SelectedValue.ToString
            'sets the add-on code and number of oversized dents
            If ddlOverSized.Enabled = True Then
                'aryEstimateInfo.SetValue("3", 4)
                aryEstimateInfo(4) = "3"
                aryEstimateInfo(7) = ddlOverSized.SelectedValue.ToString
            Else
            End If
        Case 3 'fourth estimate wizard step
        Case Else
    End Select

End Sub

これを ASP.Net ウィザード コントロールと基本的なビジュアル スタジオ 2010 で使用しています。

4

2 に答える 2

0

問題は、ボタンをクリックするたびにページがポストバックされ、ポストバックごとに aryEstimateInfo が再作成されることです。

この状況をエレガントに処理し、ページのメンテナンスを改善し、将来この種の状況をデバッグしやすくするために、次の変更をお勧めします。

1) 配列をプロパティを持つクラスに変更します。

Public Class EstimateInfo
  Public VehicleType As String = ""
  Public DamageZone As String = ""
  Public NumberOfDents As String = ""
  Public DentSize As String = ""
  Public AddOnCode As String = ""
  Public Oversized As String = ""
End Class

すべてのプロパティは文字列として宣言されていますが、基になるコンテンツをより正確に反映するようにデータ型を変更する必要があることに注意してください。

このアプローチは、自動実装されたプロパティをゲッター/セッターに変更できるため、デバッグに役立ちます。これにより、値がクリアされる場所を確認するブレークポイントを配置できます。

Private m_sVehicleType As String = ""
Public Property VehicleType As String
   Get
       Return m_sVehicleType
   End Get
   Set (Value As String
        ' You could set a breakpoint here to discover where the value is getting cleared.
       m_sVehicleType = Value
   End Set
End Property

また、たとえば、別のアプリケーションやデータベースにエクスポートするために値を文字列配列に格納する必要がある場合は、適切な文字列配列を生成するメソッドをクラスに追加できます。

2) プロパティをページに追加して、現在の回答クラスをページの ViewState に格納し、配列を継続的に再設定する必要がないようにします。例えば:

Private Property EstimateInfo As EstimateInfo
    Get
       ' Add a new record to the viewstate if it doesn't already exist
       If ViewState("EstimateInfo") Is Nothing Then
          Me.EstimateInfo = New EstimateInfo
       End If
       Return ViewState("EstimateInfo")
    End Get
    Set (value As EstimateInfo)
        ViewState("EstimateInfo") = value
    End Set
End Property

これを行うと、ウィザード コードの理解と保守がはるかに簡単になります。

Select Case wzrdEstimateWizard.ActiveStepIndex
    Case 0 'first estimate wizard step
        Me.EstimateInfo.VehicleType = rad_lstVehicleType.SelectedItem.ToString
于 2013-01-02T00:20:13.803 に答える
0

コードのどこかで新しい配列を宣言すると、ポストバック後に再度再利用することはできません。

ウィザードの終了イベントでアレイを構築することをお勧めします。ステップ全体でコントロールを使用できます。

うまくいくと思います

それ以外の場合は、セッションまたはビューステートで更新するたびに配列を保存する必要がありますが、私は両方が好きではありません

申し訳ありませんが、モバイルを使用しているため、例を表示できませんでした

于 2013-01-01T23:42:01.763 に答える