У меня есть следующий макет элемента управления, реплицированный несколько раз в приложении ASP.NET, и я хотел бы инкапсулировать функциональность в пользовательский элемент управления (или серверный или составной элемент управления, если необходимо).
PSEUDO MARKUP
LISTBOX1 (Доступные объекты)> (кнопка Добавить) LISTBOX2 (Выбранные объекты)
В основном 2 списка с доступными объектами в одном списке и выбранными объектами в другом списке (тип этих объектов будет меняться в зависимости отиспользуйте, например, коллекцию доступных и выбранных продуктов)
Пример использования: добавьте элемент списка из списка1 в список2 с помощью кнопки добавления (есть также кнопки для добавления всех и перехода из выбранного в доступное положение - этине показаны для ясности), и элемент удаляется из списка1 и помещается в список2.Довольно просто - я назову элемент управления DualListbox.
Я хотел бы сделать это:
DualListbox.ascx содержит разметку, подобную этой:
<asp:ListBox id="AvailableListBox" runat="server"/>
<asp:Button id="AddItemtoSelected" runat="server"/>
<asp:ListBox id="SelectedListBox" runat="server"/>
и DualListBox.ascx.cs содержит ряд абстрактных и неабстрактных функций, свойств и т. д.
например,
--We don't actually use CollectionBase but a class derived from it
protected abstract CollectionBase AvailableItems {get;set;}
protected abstract CollectionBase SelectedItems {get;set;}
protected abstract void SaveContentsofAvailableListBox ();
private void FillAvailableListBox ()
{
.....
AvailableListBox.DataSource = AvailableItems;
AvailableListBox.DataBind()
}
private void MoveItemfromAvailabletoSelectedListBox()
{
..Some code that takes item from available and puts it in selected.
}
Тогда я бы унаследовал от DualListbox.ascx, например,
ConcreteDualListBox : DualListBox
{
public override WidgetCollection AvailableItems {get;set;}
public override void SaveContentsofAvailableListBox(){}; etc.etc.
}
Проблема в том, что вы не можете наследовать разметку, и поэтому разметка в DualListBox недоступна для конкретного класса.Я могу определить разметку в конкретном классе, но затем использовать функции, такие как FillAvailableListBox, в базовом классе. Мне нужно было бы передать элемент управления AvailableListBox (и все другие элементы управления) в базовый класс из конкретного класса.Также для каждого конкретного класса разметка должна была бы повторяться (я мог бы встроить общую разметку в каждый конкретный класс из другого файла .ascx, я полагаю).
Буду признателен за любые предложения о том, как правильно поступить.определение такого элемента управления.
Извинения за псевдокод - на данный момент я делаю это как подтверждение концепции.
Спасибо, Рич.