通过客户端脚本更改时在服务器端访问只读文本框值的解决方案
Workarounds to access the Readonly Textbox value on server side when changed through client side script
我有一个日期文本框在网格视图的每一行。由于不允许用户在文本框中放置自己的值,我们将属性设置为ReadOnly="true"。并提供了一个日历java脚本插件,用于设置Textbox的值。现在,当我试图在保存单击时访问日期文本框时,文本框值不持久。
我也知道这个问题和解决方案。我们需要在服务器端设置readonly属性来解决这个问题。但是我最担心的是,我把文本框放在了网格视图的模板域中。因此,我需要遍历Grid视图的每一行,然后获取对日期文本框的引用,然后将readonly属性设置为readonly。看起来很笨重。谁能提出其他的替代方案或解决方法?
代码如下
<asp:GridView ID="gv_sample" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<asp:TextBox runat="server" ID="txtByWhen" ReadOnly="true" CssClass="inputbox" Text='<%#Eval("ByWhen") %>'></asp:TextBox>
</td>
<td style="padding-left: 2px;">
<img src="../Images/dateico.gif" alt="Select a date" title="Select a date"
onclick="JavaScript:return showCalendar('<%#((GridViewRow)Container).FindControl("txtByWhen").ClientID %>','dd/mm/y');" />
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
您是对的,解决方案是在代码隐藏中设置属性。(参见这个问题)
你不需要循环遍历GridView,只需要在RowCreated-Event:
protected void Page_Load(object sender, EventArgs e)
{
gv_sample.RowCreated += new GridViewRowEventHandler(gv_sample_RowCreated);
}
void gv_sample_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TextBox txtByWhen = (TextBox)e.Row.FindControl("txtByWhen");
txtByWhen.Attributes.Add("readonly", "readonly");
}
}
有另一个很酷的工作。只需将ASP文本框替换为HTML输入类型文本,并添加runat="server"属性,进一步添加readonly属性。示例代码如下
<asp:GridView ID="gv_sample" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<input type="text" runat="server" id="txtByWhen" readonly="readonly" class="inputbox"
style="width: 50px;" value='<%#Eval("ByWhen") %>' />
</td>
<td style="padding-left: 2px;">
<img src="../Images/dateico.gif" alt="Select a date" title="Select a date"
onclick="JavaScript:return showCalendar('<%#((GridViewRow)Container).FindControl("txtByWhen").ClientID %>','dd/mm/y');" />
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
在服务器端,我们可以添加下面的代码来获取值
foreach (GridViewRow gvr in RSGV_ScoreCard.Rows)
{
using (HtmlInputText txtByWhen = (HtmlInputText)gvr.FindControl(STR_BYWHEN))
{
string date=txtByWhen.Value.Trim();
}
}
尽量不要通过改变其属性使文本框直接只读。
相反,我们可以在代码后面添加以下代码行,并使文本框只读,但我们仍然可以通过回发保留其在客户端的更改值。
TextBox1.Attributes。Add("readonly"、"readonly");
终于为我解决了这个问题:)
我所做的是从文本框中删除了只读属性,并添加了一个ForceReadOnly类,其中我返回的内容如下:
$.fn.ForceReadOnly =
function () {
return this.each(function () {
$(this).keydown(function (e) {
var key = e.charCode || e.keyCode || 0;
return (key == 9);
});
});
};
$(".ForceReadOnly").ForceReadOnly();
所以我们从事件中得到readonly而不是作为属性
相关文章:
- 如何使用jquery在填充自动完成的值后使文本框只读
- 在动态crm 2011中,右键单击已完成活动的只读文本时,您是否出现错误
- 如何在单击“提交”按钮后使文本区域和 IMG 标签只读
- 文本框的一部分为只读,具有默认值
- 使用制表键时禁用只读文本框的光标焦点
- 为什么 react 将输入[类型=“文本”] 字段设为只读,除非我提供 onChange 回调
- 如果处理字符串值的文本区域是只读的,如何使用 JavaScript 在虚拟键盘上使用 CAPSLOCK 功能
- 无法使用 watir 网络驱动程序在 iframe 中填写只读文本框
- 文本框在回发时变为只读,即使手动将只读属性设置为 false
- 文本区域只读自动高度(用所选日期填充)
- 如何在javascript中设置文本框的只读属性
- 在文本区域中设置为只读
- 将文本框设置为只读,在 Javascript 中不起作用
- 将复选框和文本框设为只读
- 如何使具有只读=假的文本区域可编辑
- bootstrap wsyihtml5只读文本区域
- Request.Form集合中缺少只读文本框
- 如果输入错误,将文本输入保持为只读状态4秒
- React输入文本默认值和onblur函数使输入文本只读
- 如何使文本框中的某些文本只读,而允许对其余文本进行编辑