Как использовать скрипт динамического подсчета символов в текстовом поле, расположенном в Detailsview (ASP.NET) - PullRequest
0 голосов
/ 05 мая 2011

Я хочу получить счетчик символов, который отображает количество символов, введенных вами в текстовом поле на моей веб-странице в ASP.NET. Это текстовое поле вложено в DetailsView.

Нормальное решение включения (скрипт подсчета символов) + (onkeypress for Textbox) + (ввод только для чтения), как указано ниже, не работало:

Сценарий:

<script type="text/javascript">

    function textCounter(field, countfield, maxlimit) {
        if (field.value.length > maxlimit)
            field.value = field.value.substring(0, maxlimit);
        else
            countfield.value = maxlimit - field.value.length;
    }

</script>

Текстовое поле:

<asp:TextBox ID="TextBox1" runat="server" 
onkeyup="textCounter(TextBox1, this.DetailsView.remLen, 300);"
onkeydown="textCounter(TextBox1, this.DetailsView.remLen, 300);"
TextMode="MultiLine" Text='<%# Bind("idea") %>'></asp:TextBox>

И вход (который находится в DetailsView):

<input readonly="readonly" type="text" name="remLen" value="300" />

Затем я обнаружил , что наличие текстового поля, вложенного в DetailsView, нарушает соглашение об именах текстового поля. Я пробовал решение C # по этой ссылке, но оно не могло работать ...

Как я могу заставить эту работу? JQuery, кажется, является ответом, но я понятия не имею, где какой-то код, такой как var Text = $("span[id$=TextBox1]");, поместился бы в мои файлы. Нужна помощь!

Я работаю с Microsoft Visual Web Developer 2010 Express в VB (я новичок, который использует в основном графический интерфейс программы с некоторым опытом программирования на Android на Java). Не возражал бы против решения на C #, если бы у кого-то оно было.

Ответы [ 3 ]

0 голосов
/ 05 мая 2011

Если он находится внутри подробного представления, вам, вероятно, придется использовать FindControl. Пример:

<asp:TextBox ID="TextBox1" runat="server" 
onkeyup="textCounter('<%= ((TextBox)myDetailView.FindControl("TextBox1")).ClientID; %>', this.DetailsView.remLen, 300);"
onkeydown="textCounter('<%= ((TextBox)myDetailView.FindControl("TextBox1")).ClientID; %>', this.DetailsView.remLen, 300);"
TextMode="MultiLine" Text='<%# Bind("idea") %>'></asp:TextBox>
0 голосов
/ 10 марта 2012

Если вы используете ASP.NET 4.0 или более позднюю версию, вы можете установить свойство ClientIDMode в static. Это сохраняет идентификатор элемента управления, а не переименовывает его в .NET; например, LogoImageButton будет сохранено вместо .NET, отображая его как ctl00_LogoImageButton. Теперь ваш JavaScript может найти ваш контроль.

ПРЕДУПРЕЖДЕНИЕ: Я установил ClientIDMode = "Static" на уровне ContentPlaceHolder, чтобы добавить счетчик в текстовое поле, чтобы я знал, что он работает. НО, согласно Рику Стрэлу (который очень умный парень), вы не можете использовать элемент управления и указать ClientIDMode. Как я уже сказал, моя реализация работает так ...

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

Блог Рика: http://www.west -wind.com / weblog / posts / 2009 / Nov / 07 / ClientIDMode-in-ASPNET-40

0 голосов
/ 05 мая 2011

Вам необходимо использовать свойство ClientID текстового поля, чтобы получить его во время выполнения в javascript:

<asp:TextBox ID="TextBox1" runat="server" 
onkeyup="textCounter('<%= TextBox1.ClientID %>', this.DetailsView.remLen, 300);"
onkeydown="textCounter('<%= TextBox1.ClientID %>', this.DetailsView.remLen, 300);"
TextMode="MultiLine" Text='<%# Bind("idea") %>'></asp:TextBox>
...