私はAddHandlerコマンドを使用してハンドラをアタッチしている動的に作成されたGridViewを持っています。動的GridViewはRowCommand上に0行を持っています
問題は、私はその関数内sender.rowsを参照しようとすると、それは= 0
sender.rows.countが、私は十分なダイナミックなフォルムをやったと言うので、それは何もしないということですコントロールを作成してバインドし、init/load/load_completeページの適切な時点でハンドラーを追加することができます。
また、私は動的ではない別のフォームにほぼ同じコードビハインドを持ち、行の値にアクセスすることができます。
RowCommandイベントが発生していることを考慮すると、行をクリックしていることは明らかです。何らかの理由で、それはハンドライベントの範囲にないだけです。
これを修正する方法はありますか?
背景:私が本当にやりたいことは、行にデータバインドされている値にアクセスすることです。私はSQLCommandを作成し、それをダイナミックグリッドにバインドしています。グリッドのデータソースと話したいと思いますが、それは可能ではないようです。おそらく私は何かが欠けているかもしれませんが、今のところGridView(私がやっていることは嫌い)から値を読み取ることが唯一のことだと思われます。
おかげで、 ショーン
アップデート(コード):
(Loadイベントで実行される)動的なビューを作成します
sbFormHTML.AppendLine(String.Format("<tr><td colspan=""2""><asp:GridView ID=""{0}"" runat=""server"" DataKeyNames=""primary_key""><Columns>", dataElement.Attributes.GetNamedItem("name").Value))
sbFormHTML.AppendLine("<asp:BoundField DataField=""primary_key"" Visible=""False"" SortExpression=""primary_key"" />")
sbFormHTML.AppendLine("<asp:CommandField SelectText=""Edit"" ShowSelectButton=""True"" />")
sbFormHTML.AppendLine("<asp:CommandField ShowDeleteButton=""True"" />")
For Each data_item As XmlNode In dataElement.SelectSingleNode("data_items").ChildNodes
Dim header As String = fnGetAttributeValue(data_item, "label")
If header = "" Then header = data_item.Attributes.GetNamedItem("dbfield").Value
sbFormHTML.AppendLine(String.Format("<asp:BoundField DataField=""{0}"" HeaderText=""{1}"" SortExpression=""{0}"">", data_item.Attributes.GetNamedItem("dbfield").Value, header))
sbFormHTML.AppendLine("</asp:BoundField>")
Next
sbFormHTML.AppendLine("</Columns></asp:GridView>")
sbFormHTML.AppendLine(String.Format("</td></tr>"))
のAddHandler:行うには
'bind grid RowCommand function to all dynamic grids
Dim dynamicGrids = findWebControlsRecursive(Page, "^gvDyn")
For Each dynamicGrid As GridView In dynamicGrids
AddHandler dynamicGrid.RowCommand, AddressOf subHandleRowCommand
Response.Write(String.Format("{0} has {1} rows<br/>", dynamicGrid.ID, dynamicGrid.Rows.Count))
Next
試みそれと何か:
Protected Sub subHandleRowCommand(ByVal sender As GridView, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs)
'skm
If e.CommandName = "Select" Then
Try
Response.Write(String.Format("{0} has {1} rows<br/>", sender.ID, sender.Rows.Count))
'Remainder of the code snipped for brevity.
End Sub
データバインドグリッド:
Protected Sub sbLoadGrid(ByVal gridNode As XmlNode)
' Databind a GridView object to its SQL query
Dim conn As SqlConnection = New SqlConnection('connection string here')
conn.Open()
Dim cmd As SqlCommand = New SqlCommand("", conn)
Dim dbTable As String = gridNode.Attributes.GetNamedItem("dbtable").Value
cmd.CommandText = String.Format("SELECT {0}ID AS primary_key,", dbTable)
For Each data_item As XmlNode In gridNode.SelectSingleNode("data_items").ChildNodes
cmd.CommandText &= String.Format(" {0},", data_item.Attributes.GetNamedItem("dbfield").Value)
Next
cmd.CommandText = Regex.Replace(cmd.CommandText, ",$", String.Format(" FROM {0}", dbTable))
Dim dsGrid As SqlDataReader = cmd.ExecuteReader
Dim tempGrid As GridView = getControlReference(gridNode.Attributes.GetNamedItem("name").Value)
tempGrid.DataSource = dsGrid
tempGrid.AutoGenerateColumns = False
tempGrid.DataBind()
End Sub
コードを投稿できますか? – brendan
確かに、どのようなコードが必要ですか? GridView、AddHandler、またはハンドラを作成していますか?そして(私はこのサイトでかなり新しいですが)、どこに投稿しますか?このコメントボックスは書式設定を行わず、小さすぎます。 ありがとう、 ショーン – ShawnMilo
投稿を編集してコードを貼り付け、ツールバーを使用してコードとしてフォーマットすることができます。十分なコードを投稿して、正確に何が起こっているのかを知ることができます。 – brendan