Принудительное использование текстового поля TargetControl для использования значения в AutocompleteExtender
-
05-07-2019 - |
Вопрос
Я уверен, что для этого мне придется написать поддерживающий код JavaScript. У меня есть расширитель автозаполнения, который выбирает значения из таблицы базы данных, когда выбор сделан, я бы хотел установить идентификатор выбранного значения в скрытый элемент управления. Я могу сделать это, обработав изменение значения в текстовом поле и сделав вызов select для базы данных. Выберите idCompany из Companies, где CompanyName = " значение текстового поля " ;; Р>
Самое важное - это ограничить значения текстового поля, которое является targetcontrol для расширителя автозаполнения, ТОЛЬКО использовать значения из выпадающего списка автозаполнения. Возможно ли это с этим контролем, где-нибудь есть примеры? есть ли лучший элемент управления для использования (в наборе инструментов управления ajax или в стандартной среде .net - не сторонний элемент управления)?
Я попытаюсь выработать некоторый javascript, но я вернусь к этому вопросу, чтобы узнать, есть ли у кого-нибудь полезные ссылки. Я гуглил прошлой ночью довольно долго.
Обновление: я не получил ответа или каких-либо полезных ссылок, я разместил почти приемлемый пользовательский элемент управления, который делает то, что я хочу, с несколькими выполнимыми проблемами. Р>
Решение
Никто не смог дать мне ответ. Это была постоянная сага. Это началось, когда я пытался найти решение, не использующее выпадающие списки для больших объемов данных . Я сталкивался с проблемами так много раз в предыдущих проектах. Это кажется работоспособным кодом. Теперь мне нужно знать, как предоставить свойство AutoPostBack и разрешить некоторые события, такие как SelectedValueChanged. И из-за JavaScript, он будет конфликтовать с другим элементом управления, если у меня есть несколько из них на одной странице. Ну, это некоторые из известных проблем, с которыми я сталкиваюсь в коде, но это начало и определенно лучше, чем смотреть на зависший браузер в течение 3 или 4 минут, пока выпадающий список загружает 30k элементов списка. Р>
В этом коде предполагается, что существует файл asmx с методами сценария GetCompanyListBySearchString и GetCompanyIDByCompanyName.
ASPX FILE
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SelectCompany.ascx.cs" Inherits="Controls_SelectCompany" %>
<%@ Register TagPrefix="ajaxToolkit" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit" %>
<script language="javascript" type="text/javascript">
var txtCompanyIDHiddenField = '<%= fldCompanyID.ClientID %>';
var txtCompanyIDTextBox = '<%= txtCompany.ClientID %>';
function getCompanyID() {
if (document.getElementById(txtCompanyIDTextBox).value != "")
CompanyService.GetCompanyIDByCompanyName(document.getElementById(txtCompanyIDTextBox).value, onCompanyIDSuccess, onCompanyIDFail);
}
function onCompanyIDSuccess(sender, e) {
if (sender == -1)
document.getElementById(txtCompanyIDTextBox).value = "";
document.getElementById(txtCompanyIDHiddenField).value = sender;
}
function onCompanyIDFail(sender, e) {
document.getElementById(txtCompanyIDTextBox).value = "";
document.getElementById(txtCompanyIDHiddenField).value = "-1";
}
function onCompanySelected() {
document.getElementById(txtCompanyIDTextBox).blur();
}
</script>
<asp:TextBox ID="txtCompany" runat="server" onblur='getCompanyID()'
/><ajaxToolkit:AutoCompleteExtender runat="server" ID="aceCompany" CompletionInterval="1000" CompletionSetCount="10"
MinimumPrefixLength="2" ServicePath="~/Company/CompanyService.asmx" ServiceMethod="GetCompanyListBySearchString"
OnClientItemSelected="onCompanySelected" TargetControlID="txtCompany" />
<asp:HiddenField ID="fldCompanyID" runat="server" Value="0" />
КОД ЗА СЛЕДУЮЩИМ
[System.ComponentModel.DefaultProperty("Text")]
[ValidationProperty("Text")]
public partial class ApplicationControls_SelectCompany : System.Web.UI.UserControl
{
public string Text
{
get { return txtCompany.Text; }
set
{
txtCompany.Text = value;
//this should probably be read only and set the value based off of ID to
// make certain this is a valid Company
}
}
public int CompanyID
{
get
{
int ret = -1; Int32.TryParse(fldCompanyID.Value, out ret); return ret;
}
set
{
fldCompanyID.Value = value.ToString();
//Todo: should set code to set the Text based on the ID to keep things straight
}
}
}
Другие советы
Спасибо за ваш пост здесь. Однако полезно, если предполагается, что все знают, как настроить веб-сервис, вызываемый функцией javascript.
Извините, что так новичок, но мне не удалось вызвать веб-сервис со стороны клиента. Я прочитал эту документацию: http://msdn.microsoft.com/en-us /magazine/cc163499.aspx р>
Кроме того, я обнаружил интересный пост, в котором объясняется, как создать / получить пару имя-значение, что, как я понял, в значительной степени соответствует вашим ожиданиям:
Вы можете проверить значение выбора, перехватив событие ClientItemSelected и убедитесь, что оно не пустое.