2

ユーザーが別のデータグリッドでアイテムを選択するたびに動的に作成される DataGrid があります。最後のステップが 1 つ欠けているため、8 時間の頭痛の種になりました。ボタンが押されたときにすべての行を読み取る必要があります。基本的に、ユーザーがボタンを押すと、プログラムは各行の値 (productID または Name [この場合は一意]) を読み取り、それに「1」の値を割り当て、データベースに情報を挿入し、各行でプロセスを繰り返す必要があります。私はここまで来ました:

Protected Sub btnProcess_Click(sender As Object, e As EventArgs) Handles btnProcesss.Click
    For Each GridViewRow In GridView2.Rows

        'EmptySpace
    Next
End Sub

以上です。ループが正しくあることはわかっていますが (右ですか?)、たとえば次のコードを使用できないため、何を追加すればよいかわかりません。

Dim findrow = e.Row.Cell(cellIndex).FindControl("ControlID")

e.Rowでエラーが発生するので。続行する方法についての助けをいただければ幸いです:)。

編集: SelectedIndexChanged の下に列を生成するためのコード...

  If GridView2.Rows.Count = 0 Then
            '  dt = New DataTable()
            dt.Columns.Add(New DataColumn("Name", GetType(System.String)))
            dt.Columns.Add(New DataColumn("Price", GetType(System.String)))
        Else
            dt = DirectCast(Session("DataTable"), DataTable)
        End If

コード全体を追加しました...

Protected Sub GridView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GridView1.SelectedIndexChanged

    .
    Dim row = GridView1.SelectedRow
    If Not row Is Nothing AndAlso IsNumeric(row.Cells(3).Text) Then
        Dim Price As Double = CDbl(row.Cells(3).Text)
        Dim Name As String = CStr(row.Cells(2).Text)



        If GridView2.Rows.Count = 0 Then
            '  dt = New DataTable()
            dt.Columns.Add(New DataColumn("Name", GetType(System.String)))
            dt.Columns.Add(New DataColumn("Price", GetType(System.String)))
        Else
            dt = DirectCast(Session("DataTable"), DataTable)
        End If
        Session("DataTable") = dt

        Dim dr1 As DataRow = dt.NewRow()
        dr1(0) = Name.ToString
        dr1(1) = CDbl(Price.ToString)
        dt.Rows.Add(dr1)
        GridView2.DataSource = dt
        GridView2.DataBind()




    End If

サブ終了

更新されたボタン ハンドラー

Protected Sub btnProcess_Click(sender As Object, e As EventArgs) Handles btnProcess.Click

    For Each row As GridViewRow In GridView2.Rows

        Dim str As String = TryCast(row.FindControl("Name"), Label).Text
   'For testing purposes a MsgBox
        MsgBox(str)

    Next
4

2 に答える 2

4

正しいボタン イベントの処理は次のとおりです。

Protected Sub btnProcess_Click(sender As Object, e As EventArgs) Handles btnProcesss.Click

    For Each row As GridViewRow In Grid1.Rows

        Dim _str As String = TryCast(row.FindControl("Control1"), Label).Text
    Next

//質問の2番目の部分に追加:

名前列の値を取得するには:

Dim _NameColumnValue = TryCast(row.Cells(0), DataControlFieldCell).Text

// Label キャストを必要な Control タイプに置き換えるだけです

//コードをコンパイルしただけで、正常に動作します

よろしく

于 2013-05-16T17:01:34.577 に答える
-1

例の e.Row の代わりに、代わりに For Each ループで変数を使用しました。

タイプと混同しないように、「gvr」を使用するようにコードを少し更新しました。

Protected Sub btnProcess_Click(sender As Object, e As EventArgs) Handles btnProcesss.Click
    For Each gvr as GridViewRow In GridView2.Rows

        ' (BAD CODE - SEE COMMENTS)
        Dim findrow = gvr.Cell(cellIndex).FindControl("ControlID")

        ' (CORRECTED CODE)
        Dim MyTextBox as TextBox = CType(gvr.FindControl("MyTextBox"), TextBox) 

    Next
End Sub
于 2013-05-16T16:59:12.097 に答える