Javascript 通过客户端脚本更改时访问服务器端只读文本框值的变通方法

Javascript 通过客户端脚本更改时访问服务器端只读文本框值的变通方法,javascript,asp.net,gridview,textbox,readonly,Javascript,Asp.net,Gridview,Textbox,Readonly,我在网格视图的每一行都有一个日期文本框。由于不允许用户在文本框中输入自己的值,因此我们将属性设置为ReadOnly=“true”。并提供了一个日历java脚本插件,用于设置文本框值。现在,当我试图在单击保存时访问日期文本框时,文本框值不会持久化 我知道这个问题,也知道解决这个问题的方法。我们需要在服务器端设置readonly属性来解决这个问题。但我最担心的是,我已经将文本框放在Grid view的模板字段中。所以我需要遍历网格视图的每一行,然后获取对日期文本框的引用,然后将readonly属性设

我在网格视图的每一行都有一个日期文本框。由于不允许用户在文本框中输入自己的值,因此我们将属性设置为ReadOnly=“true”。并提供了一个日历java脚本插件,用于设置文本框值。现在,当我试图在单击保存时访问日期文本框时,文本框值不会持久化

我知道这个问题,也知道解决这个问题的方法。我们需要在服务器端设置readonly属性来解决这个问题。但我最担心的是,我已经将文本框放在Grid view的模板字段中。所以我需要遍历网格视图的每一行,然后获取对日期文本框的引用,然后将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>

","dd/mm/y",;" />

您是对的,解决方案是在Codebehind中设置属性。(请参阅)

您不必在GridView中循环,只需在RowCreated事件中循环即可:

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”属性,进一步添加只读属性。示例代码如下

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

希望这将节省大量的编码。

最终我解决了这个问题:)

我所做的是从文本框中删除了只读属性,并添加了一个ForceReadOnly类,在该类中,我不返回以下内容:

$.fn.ForceReadOnly=
函数(){
返回此。每个(函数(){
$(此).keydown(函数(e){
var key=e.charCode | | e.keyCode | | 0;
返回(键==9);
});
});
};

$(“.ForceReadOnly”).ForceReadOnly();
请不要通过更改文本框的属性直接将其设置为只读

相反,我们可以在代码隐藏中添加以下代码行,并使文本框为只读,但仍然可以通过回发在客户端保留其更改的值

TextBox1.Attributes.Add(“只读”、“只读”)

foreach (GridViewRow gvr in RSGV_ScoreCard.Rows)
{
 using (HtmlInputText txtByWhen = (HtmlInputText)gvr.FindControl(STR_BYWHEN))
  {
    string date=txtByWhen.Value.Trim();
  }
}