Я dotnet
разработчик, который недавно работал с User Control
s. Я работаю со старой веб-платформой, которая использует User Control
в проекте панели администратора.
У нас есть custom DropDownList
, который не наследуется от базового DropDownList
элемента управления Microsoft , Он создает некоторые другие элементы управления помимо базового DropDownList
и добавляет два других элемента управления в качестве своих дочерних элементов.
Теперь у меня есть идея использовать несколько DropDownList
, относящихся друг к другу. В более ясном виде я хочу, чтобы пользователь выбрал страну из # 1 DropDownList
, а мои Control
загружают города в # 2 DropDownList
БЕЗ ЛЮБОЙ ПЕРЕЗАГРУЗКИ СТРАНИЦ * .
Здесь Мой пользовательский класс:
[ToolboxData("<{0}:FormItemDropDownList runat=\"server\"></{0}:FormItemDropDownList>")]
public class FormItemDropDownList : CustomPanel
{
Base.DropDownList lstInput = new Base.DropDownList();
public string Lable { get; set; }
public string ResourceKey { get; set; }
public string Note { get; set; }
public string FileSelectionPath { get; set; } = string.Empty;
public string InvalidValues { get; set; } = string.Empty;
public string Identifier
{
get
{
EnsureChildControls();
return lstInput.Identifier;
}
set
{
EnsureChildControls();
lstInput.Identifier = value;
}
}
public bool AutoPostBack
{
get
{
EnsureChildControls();
return lstInput.AutoPostBack;
}
set
{
EnsureChildControls();
lstInput.AutoPostBack = value;
}
}
public string CssClass
{
get
{
EnsureChildControls();
return lstInput.CssClass;
}
set
{
EnsureChildControls();
lstInput.CssClass = value;
}
}
public bool Enabled
{
get
{
EnsureChildControls();
return lstInput.Enabled;
}
set
{
EnsureChildControls();
lstInput.Enabled = value;
}
}
public ListItemCollection Items
{
get
{
EnsureChildControls();
return lstInput.Items;
}
}
public int SelectedIndex
{
get
{
EnsureChildControls();
return lstInput.SelectedIndex;
}
set
{
EnsureChildControls();
lstInput.SelectedIndex = value;
}
}
public System.Web.UI.WebControls.ListItem SelectedItem
{
get
{
EnsureChildControls();
return lstInput.SelectedItem;
}
}
public string SelectedValue
{
get
{
EnsureChildControls();
return lstInput.SelectedValue;
}
set
{
EnsureChildControls();
lstInput.SelectedValue = value;
}
}
public string SetIndexByValue
{
set
{
EnsureChildControls();
lstInput.SelectedIndex = lstInput.Items.IndexOf(lstInput.Items.FindByValue(value));
}
}
public event EventHandler SelectedIndexChanged
{
add
{
EnsureChildControls();
lstInput.SelectedIndexChanged += value;
}
remove
{
EnsureChildControls();
lstInput.SelectedIndexChanged -= value;
}
}
public override void Focus()
{
// base.Focus();
lstInput.Focus();
}
protected override void OnInit(EventArgs e)
{
Identifier = Guid.NewGuid().ToString();
this.Controls.Add(lstInput);
base.OnInit(e);
}
protected override void OnPreRender(EventArgs e)
{
if (string.IsNullOrWhiteSpace(Lable))
Lable = WebTools.Utility.Resource.GetResource(ResourceKey);
ChildControlsPatern = "[DropDownListControl]";
TemplatePathKey = "FormItemDropDownListTemplatePath";
HintTemplatePathKey = "FormHintTemplatePath";
TemplateValueArray = new object[] { Lable, Note, Error, GetHintSource(ResourceKey) };
base.OnPreRender(e);
}
}
Это мои элементы просмотра:
<asp:UpdatePanel runat="server" ID="updPanel" UpdateMode="Always">
<ContentTemplate>
<custom:FormItemDropDownList runat="server" CssClass="" ID="cdrpCountryLocation" InvalidValues=",255," OnSelectedIndexChanged="cdrpLocation_SelectedIndexChanged" AutoPostBack="true" />
<custom:FormItemDropDownList runat="server" CssClass="" ID="cdrpProvinceLocation" InvalidValues=",255," OnSelectedIndexChanged="cdrpLocation_SelectedIndexChanged" AutoPostBack="true" Enabled="false" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="cdrpCountryLocation" EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="cdrpProvinceLocation" EventName="SelectedIndexChanged" />
</Triggers>
А вот мой обработчик событий:
protected void cdrpLocation_SelectedIndexChanged(object sender, EventArgs e)
{
Base.DropDownList dropDownControl = (Base.DropDownList) sender;
long parentId = Convert.ToInt64(dropDownControl.SelectedItem.Value);
if (dropDownControl.Identifier == cdrpCountryLocation.Identifier)
// This is a private method which prepare child dropdownlist items
_fillLocationDropDownBasedOnType(cdrpProvinceLocation, 0, parentId);
}
Это моя процедура. Как вы видели, я использовал UpdatePanel
для желаемого поведения. Но невероятно, как только я выбираю любую опцию в любых случаях пользовательских DropDownLists
, страница перезагружается, без каких-либо AJAX
запросов на странице.
Я пробовал много способов на форумах, никто не мог мне помочь в этой безумной проблеме. И это второй день, когда я не достиг никаких результатов.
Я также пробую этот метод с классом DropDownList
чистого Microsoft на той же странице. Он работает как брелок и отправляет AJAX
XHR
запрос на управление. Но с моим пользовательским DropDownList
элементом управления страница перезагружается перед отправкой любых XHR
s.