摘要:[ASP.NET]如何直接點選GridView上的任意列就整列選取
因應了客製化的要求,
不能使用GridView內建的設定選取功能(畫面太醜),
所以只好另尋方法來解決整列選取的問題,
果不其然還是要和 javascript 扯上關係!!
而且還牽扯到許多問題
首先在GridView的RowDataBound內加入以下程式碼:
protected void GV_Group_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onclick"] =
this.Page.ClientScript.GetPostBackEventReference((GridView) sender,"Select$" + e.Row.RowIndex);
}
}
執行後發現出現如下錯誤畫面
其實也不是第一次看到這個錯誤了,
比較偷懶和不安全的解決方法就是把enableEventValidation設成false就解決了,
不然就是照著錯誤訊息上提示的做法在ClientScript.RegisterForEventValidation內註冊我們的資料吧,
加入以下程式碼:
protected override void Render(HtmlTextWriter writer)
{
for (int i = 0; i < this.GV_Group.Rows.Count; i++)
{
Page.ClientScript.RegisterForEventValidation(this.GV_Group.UniqueID, "Select$" + i.ToString());
}
base.Render(writer);
}
完成了以上步驟,
覺得大功告成之際又發現了另一個問題!!!
當你在GridView中若是有用到CheckBox之類的控制項時(我第一個欄位是CheckBox欄位要用來多選刪除用的),
會產生javascript的事件冒泡,
這在HTML內的控制項包著控制項且內.外層控制項都會引發post back時很常見,
因此要在之前的RowDataBound內再加上以下程式碼
foreach (TableCell item in e.Row.Cells)
{
if(item.HasControls())
{
foreach (Control c in item.Controls)
{
if (c is CheckBox)
{
item.Attributes["onclick"] = "event.cancelBubble=true;";
}
}
}
}
結果終於大功告成~~