Обходные пути для доступа к значению Readonly Textbox на стороне сервера при изменении через скрипт на стороне клиента - PullRequest
2 голосов
/ 18 августа 2011

У меня есть текстовое поле даты в каждой строке вида сетки.Поскольку пользователям нельзя разрешать вводить свои собственные значения в текстовое поле, мы установили свойство как ReadOnly = "true".И предоставил плагин java-script calender, который устанавливает значение Textbox.Теперь, когда я пытаюсь получить доступ к текстовому полю даты при сохранении, значение текстового поля не сохраняется.

Я тоже знал об этой проблеме и ее решении.Нам нужно установить атрибут readonly на стороне сервера, чтобы решить эту проблему.Но моя самая большая проблема в том, что я поместил текстовое поле в поле «Шаблон» в виде сетки.Поэтому мне нужно пройтись по каждой строке представления Grid, затем получить ссылку на текстовое поле даты и затем установить атрибут 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 ]

1 голос
/ 19 августа 2011

Есть еще одна крутая работа вокруг. Просто замените текстовое поле 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();
  }
}

Надеюсь, это сэкономит много кода.

1 голос
/ 18 августа 2011

Вы правы, решение состоит в том, чтобы установить Атрибут в Codebehind. (см. этот вопрос )

Вам не нужно перебирать 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");
    }
}
0 голосов
/ 22 июня 2017

Старайтесь не делать текстовое поле доступным только для чтения, изменяя его свойства.

вместо этого мы можем добавить следующую строку кода в выделенный код и сделать текстовое поле доступным только для чтения, но все же мы можем сохранить его измененное значение на клиенте с помощью обратных передач.

TextBox1.Attributes.Add («только для чтения», «только для чтения»);

0 голосов
/ 03 декабря 2014

наконец-то это решено для меня:)

я удалил свойство «только чтение» из текстового поля и добавил класс ForceReadOnly, в котором я ничего не возвращаю, как показано ниже:

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


$(".ForceReadOnly").ForceReadOnly();

поэтому мы получили это только для чтения из события, а не как свойство

...