Динамический GridView имеет 0 строк в RowCommand - PullRequest
1 голос
/ 14 мая 2009

У меня есть динамически созданный GridView, к которому я присоединяю обработчик с помощью команды AddHandler.

Проблема в том, что когда я пытаюсь сослаться на sender.rows в этой функции, он ничего не делает, потому что говорит, что sender.rows.count = 0.

Я сделал достаточно динамического создания формы, и я почти уверен, что создаю элементы управления, связываю их и добавляю обработчик в нужных точках на странице 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 ]

1 голос
/ 15 мая 2009

Я не вижу, где функция sbloadgrid вызывается где-либо, но я настоятельно рекомендую вам попробовать рефакторинг кода для более традиционного создания GridView, установки его свойств, добавления его в качестве заполнителя на странице, если вы нужно, чтобы оно было динамичным.

С запросом я бы порекомендовал вам использовать параметры в тексте команды и добавить их в команду sql. Это все еще может быть сделано динамически и оставляет вас в конечном итоге гораздо менее проблемными, чем использование регулярных выражений для построения ваших запросов.

Вероятно, это не тот ответ, который вы хотели, но если у вас нет невероятно веской причины сохранять код таким, какой он есть, я бы предложил переписать его. Если вам известно количество столбцов в вашем запросе, я бы даже предложил настроить его на странице asp, а не динамически.

Если есть пара различных форматов, которые вы могли бы показывать, вы можете настроить каждый из них на странице и изменить только обновить источник данных и включать только один из них динамически во время выполнения, оставляя их отключенными и скрытыми по умолчанию.

Все это, вероятно, легче поддерживать.

1 голос
/ 14 мая 2009

Поскольку вы создаете элемент управления gridview динамически, ViewState не сохраняется, и это объясняет, почему rows.count возвращается в 0 в EventHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...