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

本文关键字:文本 简单 方法 只读 设置 gridview 动态 | 更新日期: 2023-09-27 18:08:39

我的GridView从绑定到它的select语句中获取数据。

我想让所有的列/行只读/不可选择,直到用户点击Edit按钮。

我的Edit按钮绑定到GridView1_RowEditing

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来获得行找到文本框,但下面的代码似乎仍然不适用。

基本上,当我单击编辑时,我希望在所选行的文本框中编辑成为可编辑的,当我单击UpdateCancel时,我计划使行变得不可编辑。

以上代码在两种情况下都不起作用(无论我是否使用GridView1.EditIndex or 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
  });

抛出了一个关于预期的错误,我认为它需要一个在上面标记的地方。

我在更新面板的结束标签内添加了如下代码:

</asp:UpdatePanel>
    <script>
        $(function () {
            $('#GridView1').find('[input type="text"]').each(function () {
                $(this).attr('disabled', 'disabled');
            })
        });
    </script>
    </asp:Content>

但是字段仍然是可编辑的。我的网站。主文件包含加载jquery文件的脚本引用,因为我在项目的其他地方使用jquery。

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

查找此事件中一行对应的每个文本框,并设置为只读。

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;
        }
    }
}