Элемент управления AutoCompleteExtender в повторителе - PullRequest
2 голосов
/ 18 февраля 2009

У меня есть AutoCompleteExtender AjaxControlToolkit элемент управления внутри повторителя, и мне нужно получить имя и значение из веб-службы. Поле автозаполнения должно хранить имя, и есть скрытое поле, в котором нужно сохранить значение. При попытке сделать это вне ретранслятора у меня обычно происходит событие OnClientItemSelected , вызывающее функцию javascript, аналогичную

function GetItemId(source, eventArgs)
{
   document.getElementById('<%= ddItemId.ClientID %>').value = eventArgs.get_value();
}

Однако, поскольку значение должно храниться в элементе управления в повторителе, мне нужен другой способ, чтобы функция javascript могла «добраться до» компонента, чтобы сохранить значение.

Ответы [ 3 ]

1 голос
/ 23 марта 2009

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

1 голос
/ 05 марта 2009

У меня есть JavaScript, который может вам помочь. Мой расширитель автозаполнения ASP.Net отсутствует в ретрансляторе, но я изменил этот код для определения идентификатора TextBox, в который вы собираетесь записать возвращенный идентификатор, он должен работать (но я не проверял его полностью через, чтобы отправить обратно). Используйте значение из параметра 'source' в методе ItemSelected на стороне клиента. Это идентификатор вызывающего расширителя автозаполнения. Просто убедитесь, что вы назначаете идентификатор скрытого TextBox в элементе повторителя, который похож на идентификатор расширителя. Примерно так:

<asp:Repeater ID="RepeaterCompareItems" runat="server">
    <ItemTemplate>
        <ajaxToolkit:AutoCompleteExtender runat="server" 
           ID="ACE_Item"
           TargetControlID="ACE_Item_Input"
           ...other properties...
           OnClientItemSelected="ACEUpdate_RepeaterItems" />
        <asp:TextBox ID="ACE_Item_Input" runat="server" />
        <asp:TextBox ID="ACE_Item_IDValue" runat="server" style="display: none;" />
    </ItemTemplate>
</asp:Repeater>

Тогда метод JS будет выглядеть так:

 function ACEUpdate_CustomerEmail(source, eventArgs) {
            UpdateTextBox = document.getElementById(source.get_id() + '_IDValue');
            //alert('debug = ' + UserIDTextBox);
            UpdateTextBox.value = eventArgs.get_value();
            //alert('customer id = ' + UpdateTextBox.value);
        }

Существуют дополнительные вызовы методов оповещения, которые можно раскомментировать для тестирования и удалить для производства. На простой и неполной тестовой странице я получил идентификаторы, которые выглядели так: RepeaterCompareItems_ctl06_ACE_Item_IDValue (для текстового поля для хранения значения) и RepeaterCompareItems_ctl07_ACE_Item (для расширителя AC) - ваш может быть немного другим, но выглядит практично. Удачи.

0 голосов
/ 05 марта 2009

Поскольку вы используете повторитель, я предлагаю подключить функцию OnItemDataBound ...

</ жерех: Repeater>

Тогда в коде позади используйте что-то вроде

`Private Sub FormatResults (отправитель ByVal как объект, ByVal как объект RepeaterItemEventArgs)

Dim dr As DataRow = CType (CType (e.Item.DataItem, DataRowView) .Row, DataRow) 'дает вам доступ ко всем данным, привязанным к строке, например. д-р ( "ID"). ToString

Dim ph As PlaceHolder = CType (e.Item.FindControl ("phResults"), PlaceHolder)

'программно создать AutoCompleteExtender && установить свойства

'программно создать кнопку, которая запускает желаемый JavaScript

«использовать» ph.Controls.Add ( ctrl ) для добавления элементов управления в PlaceHolder

End Sub`

Voila

...