2014-05-22 102 views
3

更新和取消按鈕無法正常工作,這些按鈕是出方在GridView的GridView編輯更新的行刪除通過單擊Asp.net

情景: 使用默認的asp.net gridview的設計的問題是, GridView編輯列總是佔用一些屏幕空間。此外,在編輯模式下,GridView會橫向擴展以擾亂頁面佈局。 that`s爲什麼我要呈現一個可編輯的GridView不顯示默認的編輯,更新和取消按鈕

例子:

enter image description here

什麼,我已經做了

時你會看到Gridview的html源代碼,你會發現下面的編輯,更新,取消鏈接按鈕,帶有一個名爲dopostback的事件

e.g

<a href="javascript:__doPostBack(ctl00$ContentPlaceHolder1$GridView2;Edit${1};)">Edit</a> 

如果你以某種方式產生相同的上面的腳本並執行它的一些客戶端事件(例如點擊按鈕),那麼你基本上可以發送相同的命令,GridView控件。這樣做最簡單的方法是處理GridView控件的RowDataBound事件,所以我決定把它用在GridView控件的RowDataBound事件,如下圖所示:現在

protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      if (e.Row.RowIndex == GridView2.EditIndex) 
      { 
       //update or cancel buttons 
       LinkButton updateBtn = (LinkButton)e.Row.Cells[0].Controls[0]; 
       string updateScript = ClientScript.GetPostBackClientHyperlink(updateBtn, ""); 
       Button1.Attributes["onclick"] = updateScript; 

       string cancelScript = string.Format("javascript:__doPostBack('ctl00$ContentPlaceHolder1$GridView2','Cancel${1}')", 
             GridView1.ID, e.Row.RowIndex); 
       Button2.Attributes["onclick"] = cancelScript; 
      } 
      else 
      { 
       //edit button 
       string editScript = string.Format("javascript:__doPostBack('ctl00$ContentPlaceHolder1$GridView2','Edit${1}')", 
            GridView1.ID, e.Row.RowIndex); 
       e.Row.Attributes["onclick"] = editScript; 
      } 

     } 
     if (GridView2.EditIndex >= 0) 
     { 
      Button1.Enabled = true; 
      Button2.Enabled = true; 
     } 
     else 
     { 
      Button1.Enabled = false; 
      Button2.Enabled = false; 
     } 
    } 

當我在GridView中的任何行點擊它會成爲一個可編輯的行,應取消和更新通過取消和更新按鈕,這是在gridview外,但他們不工作...

任何幫助或建議,將不勝感激。

注:仍然需要包括編輯,更新,在GridView的取消LinkBut​​ton的,你可以從使用腳本像下面的jquery gridview的後面隱藏..

$(document).ready(function() { 
    $("#GridView2 th:first-child").hide(); 
    $("#GridView2 td:first-child").hide(); 
}); 
+0

你處理'OnRowCancelingEdit','在GridView的OnRowUpdating'事件? – Hassan

+0

@HassanNisar不,我不是我只是處理編輯,更新的dopostback事件的Genrated事件和刪除的LinkBut​​ton 編輯按鈕的__doPostBack()調用的形式編輯需要在GridView的ID作爲第一個參數和行號作爲第二個參數$ 。 Update按鈕的__doPostBack()調用將第一個參數作爲控件的唯一標識。 Cancel按鈕的__doPostBack()頗爲相似,編輯按鈕除了不是編輯使用的命令名稱是取消 –

+0

請遠離直接調用__doPostBack了,這是一個可怕的黑客,因爲doPostback有是有原因的下劃線(應被認爲是私密的)。我會盡快發佈一個應該有所幫助的答案。 – julealgon

回答

0

據我所知,你只是試圖從網格內刪除編輯/更新按鈕到外部位置。

您可以通過編程設置網格的編輯索引by setting it's EditIndex property to the index you want。當然,您可以將此決定基於網格的當前選定行。

之後,您需要綁定數據綁定並將您的按鈕從「編輯」更改爲「更新」(如果您使用類似解決方案的切換)或根據需要啓用/禁用它們。

更新邏輯可以使用網格上的UpdateRow方法來保存更改。您可以按照示例here查看如何以編程方式強制編輯。在你的情況下,按一下按鈕,你需要在當前編輯指數通過,像這樣:

myGrid.UpdateRow(myGrid.EditIndex, true); 

編輯:

您希望編輯就行點擊發生,我完全繞過這個事實,這並不容易,因爲點擊該行不會導致回發。你可以使用類似this這樣的效果。它基本歸結爲在服務器上創建整個行時設置客戶端事件。儘管我還沒有測試過,但我個人認爲這部分本身應該是另一個問題,因爲它可以被孤立爲「如何從一行gridview的點擊行中引起回發」。

+0

是你有我的觀點我想刪除gridview內的編輯更新按鈕..但是你不能通過使用Gridview的EditIndex來實現這個任務,因爲你需要把取消,更新按鈕Gridview –

+0

@julealgon可以解釋更多。如何使用'UpdateRow'? – Hassan

+0

@SiddiqBaig我提到你可以使用'UpdateRow'方法強制外部行的更新。如果我記得正確,可以通過將EditIndex設置爲-1來取消編輯。這不是你想要達到的目標嗎? – julealgon

0

我找到了解決方案。與更換你GridView1_RowDataBound函數體:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      if (e.Row.RowIndex == GridView1.EditIndex) 
      { 
       //update or cancel buttons 
       LinkButton updateBtn = (LinkButton)e.Row.Cells[0].Controls[0]; 
       string updateScript = string.Format("document.getElementById('{0}').click(); return false;", updateBtn.ClientID); 
       Button1.OnClientClick = updateScript; 

       LinkButton cancelBtn = (LinkButton)e.Row.Cells[0].Controls[2]; 
       string cancelScript = string.Format("document.getElementById('{0}').click(); return false;", cancelBtn.ClientID); 
       Button2.OnClientClick = cancelScript; 
      } 
      else 
      { 
       //edit button 
       LinkButton editBtn = (LinkButton)e.Row.Cells[0].Controls[0]; 
       string editScript = string.Format("document.getElementById('{0}').click();", editBtn.ClientID); 
       e.Row.Attributes["onclick"] = editScript; 
      } 

     } 
     if (GridView1.EditIndex >= 0) 
     { 
      Button1.Enabled = true; 
      Button2.Enabled = true; 
     } 
     else 
     { 
      Button1.Enabled = false; 
      Button2.Enabled = false; 
     } 
    } 

首先我擺脫JS調用一起__doPostBack的是不好的做法在評論中提到julealgon。相反,我構建了getElementById腳本,通過唯一的客戶端ID搜索特定的鏈接按鈕,並在該鏈接上模擬「點擊」。所有的鏈接按鈕仍然在窗體上,但您撥打您的document.ready腳本,所以你不會得到JS錯誤隱藏「項目未找到......」

第二個非常重要的事情就是返回「假」在Button1和Button2的OnClientClick腳本的結束(OnClientClick與Attributes [「onclick」]的作用相同)。

這是爲了防止按鈕回發,沒有另一個回發是由按鈕本身觸發的,因爲沒有實現服務器端重新綁定網格並設置editindex的OnClick事件,一些信息丟失,並且當'網格'回發被觸發時適當的一個,由鏈接按鈕引起)它不起作用。

我的答案假定所有網格的服務器端事件如RowUpdating,RowCancelingEdit和RowEditing工作,或者您的網格具有相關的SqlDataSource或ObjectDataSource來實現這些事件。換句話說,我假設如果您使用網格行中的生成的編輯,更新,取消按鈕,它將按預期工作。

相關問題