2015-09-25 76 views
1

我有一個gridview顯示模板字段內的數據,它需要更多關於記錄的信息才能通過點擊鏈接按鈕來顯示。現在,我通過在gridview上調用edit命令來顯示信息的「細節」鏈接,以便它切換到EditItemTemplate。在EditItemTemplate中,我有一個用於取消的鏈接按鈕,然後是一個編輯按鈕,單擊它時,顯示更新按鈕和更新命令,但我需要它遍歷該行並將EditItemTemplate中的所有文本框設置爲ReadOnly = false以允許在選擇更新命令之前編輯它們。下面是代碼的摘要:在asp中使用EditItemTemplate文本框迭代:GridView

<ItemTemplate> 
    *basic information displayed* 
    <asp:LinkButton runat="server" CommandName="Edit" Text="Details"></asp:LinkButton> 
</ItemTemplate> 
<EditItemTemplate> 
    *A bunch of readonly textboxes that display the extra information* 
    <asp:LinkButton runat="server" CommandName="Update" Text="Update" Visible="false"></asp:LinkButton> 
    <asp:LinkButton runat="server" Text="Edit" OnClick="editButton_Click"></asp:LinkButton> 
</EditItemTemplate> 

而對於這使得該按鈕出現的方式我想該事件的代碼,但我不知道如何通過EditItemTemplate中迭代,或者即使這是什麼我應該做的:

Protected Sub editButton_Click(sender As Object, e As EventArgs) 
     sender.FindControl("updateButton").Visible = True 
     sender.FindControl("editbutton").Visible = False 
     For Each t In ?EditItemTemplate? 
      Dim textbox = TryCast(t, System.Web.UI.WebControls.TextBox) 
      If textbox IsNot Nothing Then 
       textbox.ReadOnly = False 
      End If 
     Next 
End Sub 

所以我的問題是,無論是如何得到這個工作,或者我應該如何建立GridViewCommands否則

+0

也許利用GridView提供的默認機制會更有意義。爲每個需要可編輯的列創建項目模板和編輯模板,然後使用「編輯」按鈕觸發「編輯」命令。這樣GridView中的相應行將使用編輯模板呈現每一列,這正是你所需要的。 – Andrei

回答

1

所以我想通了如何使用EditItemTemplate模板中的佔位符做到這一點(在VB中需要它),這裏的代碼背後:

Protected Sub editButton_Click(sender As Object, e As EventArgs) 
    sender.FindControl("editbutton").Visible = False 
    sender.FindControl("updateButton").Visible = True 

    Dim testPlacehldr As PlaceHolder = sender.FindControl("TestPlaceholder") 
    If testPlacehldr.Controls.Count > 0 Then 
     Dim btn As LinkButton = sender.FindControl("editButton") 
     If btn.Visible = False Then 
      For Each ctrl As Control In testPlacehldr.Controls 
       If ctrl.GetType Is GetType(TextBox) Then 
        Dim box As TextBox = TryCast(ctrl, TextBox) 
        box.ReadOnly = False 
       End If 
      Next 
     End If 
    End If 
End Sub 

能正常工作,什麼我需要做的。信用戶R.C.關於佔位符的想法

1

你應該在你EditItemTemplate使用PlaceHolder。將所有控件/鏈接按鈕放在此佔位符內。

<EditItemTemplate> 

<asp:PlaceHolder ID="TestPlaceHolder" runat="server"> 

// Sample Link Buttons 
    <asp:LinkButton runat="server" CommandName="Update" Text="Update" 
     Visible="false"></asp:LinkButton> 
    <asp:LinkButton runat="server" Text="Edit" OnClick="editButton_Click"></asp:LinkButton> 
// Sample Text Box 
    <asp:TextBox runat="server" ID="FirstName" ...>...</TextBox> 

</asp:PlaceHolder> 

</EditItemTemplate> 

處理GridView的RowEditing事件。裏面的編輯事件處理程序,先找到佔位符,然後使用PlaceHolder's Controls屬性來遍歷控件...

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
    // Get the Placeholder for the row being edited. 
     PlaceHolder testPlacehldr = 
     GridView.Rows[e.NewEditIndex].FindControl("TestPlaceholder") as PlaceHolder; 
     // Iterate over the controls 
     if(testPlacehldr.Controls.Count > 0) 
      {  
       foreach (Control ctrl in testPlacehldr.Controls) 
        { 
         if (ctrl is LinkButton) 
          { 
           LinkButton lnkBtn = ctrl as LinkButton 
           if(lnkBtn.Text== "Update") 
            { 
            lnkBtn.Visible = false; 
            } 
           // More IF conditions follow.... 
          } 

        if (ctrl is TextBox) 
         { 
         TextBox txtBox = ctrl as TextBox; 
         if(txtBox.ID == "FirstName")// use any property of TexBox you prefer 
            { 
            txtBox.ReadOnly= true; 
            } 
          // More IF conditions follow.... 
          } 
        }  
      }   
     //At the End, set the EditIndex and Bind the data 
      GridView1.EditIndex = e.NewEditIndex; 
      BindGridViewData(); 
    } 

我希望你能鍛鍊邏輯自己現在隱藏/顯示的控件。

+0

佔位符肯定有幫助,我自己的問題將是如何通過editbutton點擊上的這些控件重複以便使文本框顯示爲寫。你能從一個按鈕點擊事件調用GridViewEditEventArgs嗎?怎麼樣? – Omega575

相關問題