0

データベースにデータを挿入するprobelmがあります。

Dim PostId As Object = DirectCast(Repeater1.FindControl("lblPostId"), Label)

ページがlblPostIdを自動的に見つけることができないため、Findcontrolを使用する必要があります。次に、InsertCommandとパラメーターを次のように定義します。

Dim cmd As SqlCommand = conn.CreateCommand()
        cmd.CommandText = "INSERT INTO [Comments] ([CommentText], [UserName], [PostId]) VALUES (@CommentText, @UserName, @PostId)"
        cmd.Parameters.Add("@PostId", System.Data.SqlDbType.Int).Value = PostId.Text
        cmd.Parameters.Add("UserName", System.Data.SqlDbType.NVarChar).Value = Context.User.Identity.Name
        cmd.Parameters.Add("CommentText", System.Data.SqlDbType.NText).Value = text.Text
        cmd.ExecuteNonQuery()

これはmHTMLであり、ラベルはRepeater内にあります(sqldatasourceによってバインドされています)。

<asp:Label ID="lblPostId" runat="server" Text='<%# Eval("PostId") %>' />

ただし、オブジェクト変数または変数がPostIdパラメーターに設定されていないというエラーが返されます。どうしてか分かりません?どうすればこれを修正できますか?

4

2 に答える 2

1

リピーター内のコントロールを検索するときは、リピーターコントロールに表示されているItemsTemplateの数を考慮する必要があります。

FindControlメソッド_

指定されたidパラメーターを持つサーバーコントロールの現在のネーミングコンテナーを検索します

リピーターが2行のデータを返す場合、リピーター内に2つの「名前付けコンテナー」があります。各行に1つあり、Itemsコレクション内の個別のインスタンスで表されます。

したがって、を取得するためのコードlblPostIDは次のようになります。

Dim PostId As Label = DirectCast(Repeater1.Items(0).FindControl("lblPostId"), Label)
于 2013-02-22T08:51:38.890 に答える
0
Dim PostId As Object = DirectCast(Repeater1.FindControl("lblPostId"), Label)

する必要があります

Dim PostId As Label = DirectCast(Repeater1.FindControl("lblPostId"), Label)

そして、常に表示される順序でパラメータを追加します

Dim cmd As SqlCommand = conn.CreateCommand()
        cmd.CommandText = "INSERT INTO [Comments] ([CommentText], [UserName], [PostId]) VALUES (@CommentText, @UserName, @PostId)"
        cmd.Parameters.Add("@CommentText", System.Data.SqlDbType.NText).Value = text.Text
        cmd.Parameters.Add("@UserName", System.Data.SqlDbType.NVarChar).Value = Context.User.Identity.Name
        cmd.Parameters.Add("@PostId", System.Data.SqlDbType.Int).Value = CInt(PostId.Text)
        cmd.ExecuteNonQuery()
于 2013-02-22T07:30:54.703 に答える