[ASP.NET]如何直接點選GridView上的任意列就整列選取

摘要:[ASP.NET]如何直接點選GridView上的任意列就整列選取

因應了客製化的要求,

不能使用GridView內建的設定選取功能(畫面太醜no),

所以只好另尋方法來解決整列選取的問題,

果不其然還是要和 javascript 扯上關係!!

而且還牽扯到許多問題crying

首先在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;";
        }
      }
    }
 } 

結果終於大功告成~~