在 gridview 行中动态设置只读文本框的简单方法?
Simple way to have dynamically set readonly text boxes in gridview rows?
我的 GridView
正在从绑定到它的 select 语句中获取数据。
我想制作所有 columns/rows read-only/unselectable,直到用户单击 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
class 的 EditIndex
来获取刚刚由 NewEditIndex
设置的行的索引。在上面的代码中,我还尝试设置 e.NewEditIndex
来获取查找 TextBox 的行,但下面的代码似乎仍然不适用。
基本上,当我单击编辑时,我希望 selected 行中用于编辑的文本框变得可编辑,当我单击 Update
或 Cancel
时,我计划让行变得不可编辑。
以上代码在任何一种情况下都不起作用(无论我使用 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>
但字段仍然是可编辑的。我的 Site.Master 文件包含加载 jquery 文件的脚本引用,因为我在项目的其他地方使用 jquery。
在此事件中找到一行的每个文本框并设为只读。
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;
}
}
}
我的 GridView
正在从绑定到它的 select 语句中获取数据。
我想制作所有 columns/rows read-only/unselectable,直到用户单击 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
class 的 EditIndex
来获取刚刚由 NewEditIndex
设置的行的索引。在上面的代码中,我还尝试设置 e.NewEditIndex
来获取查找 TextBox 的行,但下面的代码似乎仍然不适用。
基本上,当我单击编辑时,我希望 selected 行中用于编辑的文本框变得可编辑,当我单击 Update
或 Cancel
时,我计划让行变得不可编辑。
以上代码在任何一种情况下都不起作用(无论我使用 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>
但字段仍然是可编辑的。我的 Site.Master 文件包含加载 jquery 文件的脚本引用,因为我在项目的其他地方使用 jquery。
在此事件中找到一行的每个文本框并设为只读。
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;
}
}
}