c # gridview строка щелчка - PullRequest
       21

c # gridview строка щелчка

19 голосов
/ 01 декабря 2008

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

В моем событии RowCreated у меня есть следующая строка:

e.Row.Attributes.Add(
     "onClick",
     ClientScript.GetPostBackClientHyperlink(
          this.grdSearchResults, "Select$" + e.Row.RowIndex));

Для предотвращения сообщений об ошибках у меня есть этот код:

protected override void Render(HtmlTextWriter writer)
{
    // .NET will refuse to accept "unknown" postbacks for security reasons. 
    // Because of this we have to register all possible callbacks
    // This must be done in Render, hence the override
    for (int i = 0; i < grdSearchResults.Rows.Count; i++)
    {
        Page.ClientScript.RegisterForEventValidation(
                new System.Web.UI.PostBackOptions(
                    grdSearchResults, "Select$" + i.ToString()));
    }
    // Do the standard rendering stuff
    base.Render(writer);
}

Как я могу дать строке уникальный идентификатор (из БД), и когда я щелкаю по строке, открывается другая страница (например, щелчок по ссылке), и эта страница может считывать идентификатор.

Ответы [ 9 ]

19 голосов
/ 06 апреля 2010

Мартейн,

Вот еще один пример с отличной подсветкой строк и курсором в стиле href:

<code>protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#ceedfc'");
    e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");
    e.Row.Attributes.Add("style", "cursor:pointer;");
    e.Row.Attributes.Add("onclick", "location='patron_detail.aspx?id=" + e.Row.Cells[0].Text + "'");
  }
}

Код выше работает в .NET 3.5. Однако вы не можете установить для столбца id значение Visible = "false", поскольку вы получите пустое значение строки запроса для своего ключа идентификатора:

<code><asp:GridView ID="gvSearch" runat="server" OnRowDataBound="gvSearch_RowDataBound" AutoGenerateColumns="false">
  <Columns>
    <asp:BoundField DataField="id" Visible="false" />
    <asp:BoundField DataField="first_name" HeaderText="First" />
    <asp:BoundField DataField="last_name" HeaderText="Last" />
    <asp:BoundField DataField="email" HeaderText="Email" />
    <asp:BoundField DataField="state_name" HeaderText="State" />
  </Columns>
</asp:GridView>

Поэтому измените первый столбец на этот:

<code><asp:BoundField DataField="id" ItemStyle-CssClass="hide" />

Добавьте эту CSS в начало своей страницы:

<code><head>
  <style type="text/css">
    .hide{
      display:none;
    }
  </style>
<head>

Но чтобы скрыть первую ячейку строки вашего заголовка, добавьте это к вашему gvSearch_RowDataBound () с выделенным кодом:

<code>if (e.Row.RowType == DataControlRowType.Header)
{
  e.Row.Cells[0].CssClass = "hide";
}

Очевидно, вы могли бы также скрыть столбец id в code-behind, но это приведет к большему количеству текста в вашей разметке, чем класс css:

<code>e.Row.Cells[0].Attributes.Add("style", "display:none;");
e.Row.Attributes.Add("style", "cursor:pointer;");
19 голосов
/ 01 декабря 2008

У меня есть решение.

Вот что я сделал:

if(e.Row.RowType == DataControlRowType.DataRow)
{
    e.Row.Attributes["onClick"] = "location.href='view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "'";
}

Я поместил предыдущий код в событие RowDataBound.

3 голосов
/ 13 февраля 2009
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
        e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";    
    }
}
1 голос
/ 15 июня 2011
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)  
{     
 if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridViewRow gvr = e.Row;
            string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();         
            gvr.Attributes.Add("OnClick", "javascript:location.href='Default.aspx?id=" + abc + "'");
        }         

   }  
}  
1 голос
/ 07 июля 2010
protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
        string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString(); 
        e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";     
    } 
} 
0 голосов
/ 03 марта 2011

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

e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=''");

Изменено на:

e.Row.Attributes.Add("onmouseout", "if(" + e.Row.RowIndex + "% 2 == 0) { this.style.backgroundColor=''; } else { this.style.backgroundColor = '#E8F7EA'; }");

Если есть лучший способ сделать это, пожалуйста, дайте мне знать, но он отлично работает для меня.

Привет.

0 голосов
/ 22 июня 2009

Для него можно использовать событие RowCommand вида сетки. В вашей кнопке / ссылке, где вы хотите установить клик, установите CommandName и CommandArgument, которые вы можете использовать в параметре EventArgs метода события.

0 голосов
/ 13 февраля 2009

щелчок строки в виде сетки перенаправляет на другую страницу

    protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
             string abc = ((GridView)sender).DataKeys[e.Row.RowIndex].Value.ToString();
             e.Row.Attributes["onClick"] = "location.href='Default.aspx?id=" + abc + "'";
        }
    }

работает абсолютно нормально

0 голосов
/ 01 декабря 2008

Может ли ваш идентификатор быть связан с элементом данных, отображаемым в виде сетки?

Если это так, вы можете использовать e.Row.DataItem и привести его к какому-либо типу.

...