Как реализовать выделение полной строки в GridView без кнопки выбора? - PullRequest
30 голосов
/ 06 июня 2011

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

enter image description here

Для реализациичто я использую следующий код:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Set the hand mouse cursor for the selected row.
        e.Row.Attributes.Add("OnMouseOver", "this.style.cursor = 'hand';");

        // The seelctButton exists for ensuring the selection functionality
        // and bind it with the appropriate event hanlder.
        LinkButton selectButton = new LinkButton()
        {
            CommandName = "Select",
            Text = e.Row.Cells[0].Text
        };

        e.Row.Cells[0].Controls.Add(selectButton);
        e.Row.Attributes["OnClick"] =
             Page.ClientScript.GetPostBackClientHyperlink(selectButton, "");
    }
}

С кодом выше, есть следующие проблемы:

  • Это прекрасно работает, только если я EnableEventValidation длядля страницы установлено значение false.
  • SelectedIndexChanged запускается только в том случае, если Grid.DataBind() вызывается в Page_Load для страницы (при каждой обратной передаче).

Я что-то не так делаю?Есть ли лучшая реализация?


Редактировать: Когда EnableEventValidation установлен на true, появится следующая ошибка:

Invalidобратный или обратный аргумент.Проверка события включена с использованием в конфигурации или <% @ Page EnableEventValidation = "true"%> на странице.В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова исходят от серверного элемента управления, который первоначально их представил.Если данные действительны и ожидаемы, используйте метод ClientScriptManager.RegisterForEventValidation, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки.

Ответы [ 5 ]

46 голосов
/ 06 июня 2011

Вы должны добавлять это при каждой обратной передаче, а не только при привязке данных.Поэтому вам следует использовать RowCreated -Событие GridView.

Например

(C #):

protected void GridView1_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow) {
        e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
        e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
        e.Row.ToolTip = "Click to select row";
        e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + e.Row.RowIndex);
    }
}

(VB.Net):

Private Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated
    If e.Row.RowType = DataControlRowType.DataRow Then
        e.Row.Attributes("onmouseover") = "this.style.cursor='pointer';this.style.textDecoration='underline';"
        e.Row.Attributes("onmouseout") = "this.style.textDecoration='none';"
        e.Row.ToolTip = "Click to select row"
        e.Row.Attributes("onclick") = Me.Page.ClientScript.GetPostBackClientHyperlink(Me.GridView1, "Select$" & e.Row.RowIndex)
    End If
End Sub
13 голосов
/ 27 марта 2013

Вместо того, чтобы делать это на RowCreated, вы можете сделать это на Render().Таким образом, вы можете использовать перегрузку GetPostBackClientHyperlink со значением true на registerForEventValidation и избежать ошибки «неверный аргумент обратного вызова / обратного вызова».

Примерно так:

protected override void Render(HtmlTextWriter writer)
    {
      foreach (GridViewRow r in GridView1.Rows)
      {
        if (r.RowType == DataControlRowType.DataRow)
        {
          r.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
          r.Attributes["onmouseout"] = "this.style.textDecoration='none';";
          r.ToolTip = "Click to select row";
          r.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + r.RowIndex,true);

        }
      }

      base.Render(writer);
    }
3 голосов
/ 06 июня 2011
<style type="text/css">
    .hiddenColumn
    {
        display: none;
    }

    .rowGrid
    {
        cursor: pointer;
    }
</style>

<asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="true" >
            <RowStyle CssClass="rowGrid" />
            <Columns>
                <asp:CommandField ButtonType="Button" ShowSelectButton="true" HeaderStyle-CssClass="hiddenColumn"
                    ItemStyle-CssClass="hiddenColumn" FooterStyle-CssClass="hiddenColumn" />
            </Columns>
        </asp:GridView>

<script type="text/javascript">
        $(function () {
            $("#<%= GridView1.ClientID %> tr.rowGrid")
            .live("click", function (event) {
                $(this).find("input[type='button'][value='Select']").click();
            });

            $("#<%= GridView1.ClientID %> input[type='button'][value='Select']")
                .live("click", function (event) {
                    event.stopPropagation();
                });

        });
    </script>
0 голосов
/ 06 июня 2011

Попробуйте это добавить событие OnSelectedIndexChanged в сетку

   OnSelectedIndexChanged="Grid_SelectedIndexChanged"

и затем в коде

 protected void Grid_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow row = gvSummary.SelectedRow;
    //Int32 myvalue= Convert.ToInt32(row.Attributes["ColumnName"].ToString());
   } 

и установите EnableViewState = "false" но здесь вы должны выполнить еще две вещи, которые вы уже сделали в своем коде означает установите для параметра EnableEventValidation значение false и привязку данных сетки на странице Load ..

0 голосов
/ 06 июня 2011

Попробуйте использовать <asp:LinkButton> вокруг <tr> в ASPX-коде, установите LinkButton's CommandName='Select' И в элементе команды item обработайте эту команду и установите стиль выбранной строки!

...