通过客户端脚本更改时在服务器端访问只读文本框值的解决方案

Workarounds to access the Readonly Textbox value on server side when changed through client side script

本文关键字:文本 只读 访问 解决方案 服务器端 客户端 过客 脚本      更新时间:2023-09-26

我有一个日期文本框在网格视图的每一行。由于不允许用户在文本框中放置自己的值,我们将属性设置为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而不是作为属性