2009-05-14 13 views
1

私は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 
+2

コードを投稿できますか? – brendan

+0

確かに、どのようなコードが必要ですか? GridView、AddHandler、またはハンドラを作成していますか?そして(私はこのサイトでかなり新しいですが)、どこに投稿しますか?このコメントボックスは書式設定を行わず、小さすぎます。 ありがとう、 ショーン – ShawnMilo

+0

投稿を編集してコードを貼り付け、ツールバーを使用してコードとしてフォーマットすることができます。十分なコードを投稿して、正確に何が起こっているのかを知ることができます。 – brendan

答えて

1

sbloadgrid関数がどこから呼び出されているのかわかりませんが、コードをより伝統的なGridViewの作成にリファクタリングし、そのプロパティを設定し、ページのプレースホルダに追加することを強くお勧めしますあなたはそれが動的である必要があります。

クエリでは、コマンドテキストにパラメータを使用してsqlコマンドに追加することをお勧めします。それはまだ動的に行うことができますし、長期的に問題を少なくしてから、正規表現を使ってクエリを構築することができます。

おそらくあなたが望む答えではありませんが、コードをそのままにしておく理由が非常に強い場合を除いて、書き直すことをお勧めします。あなたがあなたのクエリで取得する列の数が手前に知られている場合でも、私はあなたのASPページではなく、動的に設定することをお勧めします。

表示される可能性のあるいくつかの異なるフォーマットがある場合は、それらをページ上にそれぞれ設定して変更するだけで、データソースを更新し、実行時にそれらのいずれかを動的に有効にして、

これはおそらく保守が容易です。

+1

私は結局これをして、すべてうまく動いていた。しかし、要件が変更され、これを必要とする機能が削除されました。 Go figure。とにかく、私はPythonとDjangoのすばらしさの世界で、今や別の会社に幸せに、ASP.NETから安全です。わーい! – ShawnMilo

+0

うれしい私は助けることができます。 –

1

あなたが動的にGridViewコントロールを作成しているので、ViewStateは永続取得されていないとrows.countはEventHandlerの中に0として戻って来ている理由が説明するだろう。