C# 在gridview行中动态设置只读文本框的简单方法?

C# 在gridview行中动态设置只读文本框的简单方法?,c#,asp.net,gridview,webforms,C#,Asp.net,Gridview,Webforms,MyGridView从绑定到它的select语句获取数据 我希望在用户单击Edit按钮之前,所有列/行都是只读/不可选择的 我的Edit按钮绑定到GridView1\u行编辑 protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { GridView1.EditIndex = e.NewEditIndex; Te

My
GridView
从绑定到它的select语句获取数据

我希望在用户单击
Edit
按钮之前,所有列/行都是只读/不可选择的

我的
Edit
按钮绑定到
GridView1\u行编辑

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {            
            GridView1.EditIndex = e.NewEditIndex;
            TextBox txtBoxResTitle = (TextBox)GridView1.Rows[GridView1.EditIndex].FindControl("txtBoxResTitle");
            txtBoxResTitle.ReadOnly = false;
            txtBoxResTitle.Enabled = true;
            BindData();
        }
在上面的代码片段中,我使用
GridView
类的
EditIndex
来获取刚刚由
NewEditIndex
设置的行的索引。在上面的代码中,我还尝试设置
e.NewEditIndex
以获取用于查找文本框的行,但下面的代码似乎仍然不适用

基本上,当我单击“编辑”时,我希望所选行中用于编辑的文本框变为可编辑,当我单击“更新”或“取消”时,我计划使该行变为不可编辑

上述代码在两种情况下都不起作用(无论我使用的是
GridView1.EditIndex还是e.NewEditIndex

下面是我的gridview页面代码

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
        <asp:GridView runat="server" AutoGenerateColumns="false" ID="GridView1" AllowPaging="true"

          ... styling snipped ...

            OnRowEditing="GridView1_RowEditing"
            OnRowUpdating="GridView1_RowUpdating"
            OnPageIndexChanging="GridView1_PageIndexChanging"
            OnRowCancelingEdit="GridView1_RowCancelingEdit"
            OnRowDeleting="GridView1_RowDeleting">

            ... styling snipped ... 

            <Columns>
                <asp:TemplateField HeaderText="pk1" Visible="false">
<ItemTemplate>
<asp:Label ID="lblResPk1" runat="server" visible="false" Text='<%#Eval ("pk1")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
                <asp:TemplateField HeaderText="Resource Title">
                    <ItemTemplate>
                        <asp:TextBox ID="txtBoxResTitle" readonly="true" Enabled="false" runat="server" Text='<%#Eval ("resource_title")%>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Resource Type">
                    <ItemTemplate>
                        <asp:TextBox ID="txtBoxResType" runat="server" Text='<%#Eval ("resource_type")%>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Cost">
                    <ItemTemplate>
                        <asp:TextBox ID="txtBoxResCost" runat="server" Text='<%#Eval ("resource_cost")%>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Availability">
                    <ItemTemplate>
                        <asp:TextBox ID="txtBoxResAvail" runat="server" Text='<%#Eval ("available")%>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Edit" ShowHeader="false">
<EditItemTemplate>
<asp:LinkButton ID="lnkbtnUpdate" runat="server" CausesValidation="true" Text="Update" CommandName="Update"></asp:LinkButton>
<asp:LinkButton ID="lnkbtnCancel" runat="server" CausesValidation="false" Text="Cancel" CommandName="Cancel"></asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
<asp:LinkButton ID="btnEdit" runat="server" CausesValidation="false" CommandName="Edit" Text="Edit"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField HeaderText="Delete" ShowDeleteButton="true" ShowHeader="true" />
<asp:CommandField HeaderText="Select" ShowSelectButton="true" ShowHeader="true" />
            </Columns>

        </asp:GridView>
            <asp:Label ID="lblDeleteException" runat="server" Text="Label" Font-Bold="True" ForeColor="#FF3300" Visible="False"></asp:Label>
            </ContentTemplate>
    </asp:UpdatePanel>

... 造型剪短。。。
请告知

底层jquery代码

$(function() {
$('#GridView1').find('[input type="text"]').each(function() {
     $(this).attr('disabled', 'disabled');
}) <-------extra ) needed
  });
$(函数(){
$(“#GridView1”)。查找(“[input type=“text”]”)。每个(函数(){
$(this.attr('disabled','disabled');

})在此事件中查找一行的每个文本框并设置为只读

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    foreach (Control ctrl in e.Row.Controls)
    {
        MakeTextboxesReadonly(ctrl);
    }

}

private static void MakeTextboxesReadonly(Control parent)
{
    foreach (Control ctrl in parent.Controls)
    {
        if (ctrl is TextBox)
        {
            (ctrl as TextBox).Enabled = false;
        }
    }
}

在我的HTML中,我需要添加OnRowCreated=“GridView1\u RowCreated”对吗?如何通过每个ctrl键循环以提高效率/页面加载时间?似乎是次优的。这对我不起作用。是因为我使用SqlDataAdapter将数据绑定到gridview吗?OnRowCreated事件正在触发,但当它到达“如果(ctrl是TextBox)“它不接受条件为true。如果您调用GridView1.DataSource=“您的数据源”,然后调用GridView1.DataBind(),则此事件正在触发。什么不完全起作用。可以使用JQuery吗?它不起作用,因为在我调试“ctrl”时的实例中是一个DataControlFieldHeaderCell,它永远不会是一个文本框。这就是为什么我在“你可能必须检查ctrl是否不是一个文本框,然后循环它的控件(如果有),但你明白了。”。给我一秒钟,我会告诉你如何获得它。
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    foreach (Control ctrl in e.Row.Controls)
    {
        MakeTextboxesReadonly(ctrl);
    }

}

private static void MakeTextboxesReadonly(Control parent)
{
    foreach (Control ctrl in parent.Controls)
    {
        if (ctrl is TextBox)
        {
            (ctrl as TextBox).Enabled = false;
        }
    }
}