GridViewの行をクリックすると、データベースから取得したIDで別のページに移動します。
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);
}
行に(DBからの)一意のIDを与えるにはどうすればよいですか。行をクリックすると、別のページが開き(hrefをクリックするなど)、そのページはIDを読み取ることができます。
私には解決策があります。
これは私がやったことです:
if(e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onClick"] = "location.href='view.aspx?id=" + DataBinder.Eval(e.Row.DataItem, "id") + "'";
}
上記のコードをRowDataBoundイベントに配置しました。
マルティン、
気の利いた行の強調表示と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キーに空のクエリ文字列値を取得するため、id列をVisible = "false"に設定することはできません。
<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;");
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 + "'";
}
}
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 + "'";
}
}
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 + "'");
}
}
}
グリッドビューのRowCommandイベントを使用できます。クリックを設定するボタン/リンクで、CommandNameおよびCommandArgumentを設定します。これらは、イベントメソッドのEventArgsパラメーターでアクセスできます。
グリッドビューの行クリックで他のページにリダイレクト
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 + "'";
}
}
完全にうまくいきます
あなたのIDは、gridviewに表示されるデータ項目に関連付けることができますか?
その場合は、e.Row.DataItemを使用して、それを任意のタイプにキャストできます。
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'; }");
それを行うより良い方法がある場合は、私に知らせてください。しかし、それは私にとって完璧に機能しています。
こんにちは。