С# gridview row click
Когда я нажимаю на строку в своем 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);
}
Как я могу присвоить строке уникальный идентификатор (из БД), и когда я нажимаю на строку, открывается другая страница (например, щелчок на href), и эта страница может прочитать идентификатор.
Ответы
Ответ 1
У меня есть решение.
Это то, что я сделал:
if(e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onClick"] = "location.href='view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "'";
}
Я поместил предыдущий код в событие RowDataBound.
Ответ 2
Мартейн,
Вот еще один пример с подсветкой строки и курсором стиля href:
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", потому что вы получите пустое значение строки запроса для вашего ключа id:
<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>
Итак, измените вместо этого первый столбец:
<asp:BoundField DataField="id" ItemStyle-CssClass="hide" />
Добавьте этот css в начало страницы:
<head>
<style type="text/css">
.hide{
display:none;
}
</style>
<head>
Но чтобы скрыть первую ячейку вашей строки заголовка, добавьте ее в свой gvSearch_RowDataBound() в коде:
if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.Cells[0].CssClass = "hide";
}
Очевидно, что вы могли бы скрыть столбец id в коде, также, но это приведет к появлению большего количества текста в вашей разметке, чем класс css:
e.Row.Cells[0].Attributes.Add("style", "display:none;");
e.Row.Attributes.Add("style", "cursor:pointer;");
Ответ 3
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 + "'";
}
}
Ответ 4
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 + "'";
}
}
Ответ 5
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 + "'");
}
}
}
Ответ 6
Может ли ваш идентификатор быть связан с элементом данных, отображаемым в gridview?
Если это так, вы можете использовать e.Row.DataItem и передать его любому типу.
Ответ 7
щелчок строки в режиме сетки перенаправляется на другую страницу
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 + "'";
}
}
работает абсолютно нормально
Ответ 8
Вы можете использовать событие RowCommand в виде сетки для него. В вашей кнопке/ссылке, где вы хотите установить клик, задайте CommandName и CommandArgument, которые вы можете использовать в параметре EventArgs метода события.
Ответ 9
JohnB, ваш код работает очень хорошо, я добавил немного взлома, чтобы избежать чередования рутинга RowStyle после мыши.
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'; }");
Если есть лучший способ сделать это, пожалуйста, дайте мне знать, но он работает идеально для меня.
Привет.