我在网格视图的每一行都有一个日期文本框。由于不允许用户在文本框中放置自己的值,因此我们将属性设置为ReadOnly =“true”。并提供了一个日历java脚本插件,用于设置Textbox值。现在,当我尝试在保存单击时访问日期文本框时,文本框值不会保留。
我也知道这个问题和解决方案。我们需要在服务器端设置readonly属性来解决此问题。但我最关心的是,我已将Textbox放在Grid视图的Template字段中。所以我需要循环遍历Grid视图的每一行,然后获取日期Textbox的引用,然后将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>
答案 0 :(得分:1)
你是对的,解决方法是在Codebehind中设置属性。 (见this question)
您不必遍历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");
}
}
答案 1 :(得分:1)
有另一个很酷的工作。只需用HTML输入类型文本替换ASP文本框并添加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();
}
}
希望这会节省大量编码。
答案 2 :(得分:0)
最后这个问题解决了我:)
我所做的是从文本框中删除了只读属性,并添加了一个ForceReadOnly类,我在其中返回的内容如下:
$.fn.ForceReadOnly =
function () {
return this.each(function () {
$(this).keydown(function (e) {
var key = e.charCode || e.keyCode || 0;
return (key == 9);
});
});
};
$(".ForceReadOnly").ForceReadOnly();
&#13;
所以我们从事件中获取了readonly而不是属性
答案 3 :(得分:0)
尽量不要通过更改其属性直接使文本框成为只读文件。
而不是我们可以在代码隐藏中添加以下代码行并使文本框只读,但我们仍然可以通过回发在客户端保留其更改的值。
TextBox1.Attributes.Add(&#34; readonly&#34;,&#34; readonly&#34;);