能够访问 GridView -> TemplateField -> EditItemTemplate 中的某些元素的问题

Problem with being able to access certain elements in GridView -> TemplateField -> EditItemTemplate

我无法访问

中的某些元素
GridView -> TemplateField -> EditItemTemplate.

为了更清楚,我有文本框和按钮 (in GridView -> TemplateField -> EditItemTemplate) 并且其中只有一个必须可见,具体取决于操作。如果我想编辑,按钮必须可见,如果我想添加新用户,则文本框必须可见。我已经添加了我的 aspx 代码供您检查以及 C# 代码隐藏。 C# 代码中的方法是当我按下“编辑”按钮时立即调用的方法,它允许编辑一个用户的帐户详细信息和权限。我希望此方法决定何时显示文本框或按钮(我有 IsUserInsertMode 属性。)
如果有人能帮助我解决这个问题,我将不胜感激。

      <asp:GridView CssClass="grid" ID="gridUsers" runat="server"
       AutoGenerateColumns="False" DataKeyNames="id"
       DataSourceID="dsrcUserList" GridLines="None"
       OnRowCommand="gridUsers_RowCommand" OnDataBound="gridUsers_DataBound"
       OnRowUpdating="gridUsers_Updating" OnRowUpdated="gridUsers_Updated" EnableModelValidation="True">
               <Columns>

                <asp:TemplateField HeaderText="Password" ItemStyle-HorizontalAlign="center" ItemStyle-Width="80px">
                                <ItemTemplate>
                                   *******
                                </ItemTemplate>

                                 <EditItemTemplate>
                                        
                                   **NEED REFERENCES TO THESE TWO ITEMS IN ORDER TO SET THEIR VISIBILITY**
                                    <asp:Button ID="btnEditPassword" Text="Change" runat="server" CausesValidation="false" OnClick="btnEditPassword_Click" Visible="false"/> 
                                    <asp:TextBox ID="txtPassword" runat="server" TextMode="Password" Text='<%# Bind("Password") %>' Width="74px" MaxLength="50" Visible="true" />

                                 </EditItemTemplate>
                </asp:TemplateField>
                                 **LOTS OF CHECKBOXES LIKE THOSE**
                                 <asp:CheckBoxField DataField="AccessTowsRelease" HeaderText="TowsRelease" ItemStyle-HorizontalAlign="Center">
                                                <ItemStyle HorizontalAlign="Center"></ItemStyle>
                                            </asp:CheckBoxField>

                                 <asp:CheckBoxField DataField="AccessTowsView" HeaderText="TowsView" ItemStyle-HorizontalAlign="Center">
                                                <ItemStyle HorizontalAlign="Center"></ItemStyle>
                                            </asp:CheckBoxField>

                                 <asp:CheckBoxField DataField="AccessSMS" HeaderText="SMS"
                                                ItemStyle-HorizontalAlign="Center">
                                                <ItemStyle HorizontalAlign="Center"></ItemStyle>
                                            </asp:CheckBoxField>

                                 **MY EDIT BUTTON**
                                 <asp:CommandField ButtonType="Link"
                                  ShowEditButton="true" EditText="Edit"
                                  CancelText="Cancel" UpdateText="Save" />
         
               </Columns>             
      </asp:GridView>

C# code-behind (I have added some of the stuff that I have tried)

// this is called when I press some button which lets me to edit one user data including password
// but when I want to change password, there should be button which would redirect to different 
// window to do the password change procedure.
// And when I want to add new user there should be textbox for password, not the button.
protected void gridUsers_RowCommand(Object sender, GridViewCommandEventArgs e)
{
    //Found the way to get the index of current row (represents one row of information which is visible for the client in browser)
    int rowIndex = Convert.ToInt32(e.CommandArgument);
    
    //if those would be working I wouldn't be here asking for help
    btnEditPassword.Visible = true;
    txtPassword.Visible = false;
    
    
    //Can't cast 'System.Web.UI.WebControls.GridView' to type 'System.Web.UI.WebControls.GridViewRow'
    Button btnEditPassword = (Button)((GridViewRow)sender).FindControl("btnEditPassword");
    
    //every attempt to use FindControl gets me null
    Button btnEditPassword = (Button)this.gridUsers.Rows[rowIndex].FindControl("btnEditPassword");
    
    // my way to check if it works - if its null then I do can't anything (prints to browser console).
    if (btnEditPassword != null) Response.Write("<script>console.log('not null')</script>");
    else Response.Write("<script>console.log('null')</script>");
}

RowCommand-事件对于您的案例来说为时过早。它在行进入编辑模式之前引发,这就是为什么您找不到编辑项模板的控件的原因。

首先更改您的标记以处理 RowDataBound-事件:

<asp:GridView ... OnRowDataBound="gridUsers_OnRowDataBound" ...>

然后在 OnRowDataBound 事件中这样处理:

protected void gridUsers_OnRowDataBound(object sender, GridViewRowEventArgs e) {
    // check if row is in edit state
    if ((e.Row.RowState == DataControlRowState.Edit) || (e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))) {
        
        // look for the control in the row
        Button btnEditPassword = (Button)e.Row.FindControl("btnEditPassword");
    }
}