通过客户端脚本更改时访问服务器端的Readonly Textbox值的变通方法

时间:2011-08-18 10:32:16

标签: javascript asp.net gridview textbox readonly

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

4 个答案:

答案 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类,我在其中返回的内容如下:

&#13;
&#13;
    $.fn.ForceReadOnly =
function () {
    return this.each(function () {
        $(this).keydown(function (e) {
            var key = e.charCode || e.keyCode || 0;
            return (key == 9);
        });
    });
};


$(".ForceReadOnly").ForceReadOnly();
&#13;
&#13;
&#13;

所以我们从事件中获取了readonly而不是属性

答案 3 :(得分:0)

尽量不要通过更改其属性直接使文本框成为只读文件。

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

TextBox1.Attributes.Add(&#34; readonly&#34;,&#34; readonly&#34;);