PerformDataBinding не запускается в DataBoundControlAdapter для ListBox - PullRequest
1 голос
/ 03 февраля 2012

Я пытаюсь создать DataBoundControlAdapter для элемента управления ListBox, но по какой-то причине он не запускает метод PerformDataBinding в моем DataBoundControlAdapter.

Согласно документации MSDN :

Метод PerformDataBinding вызывается вместо метода DataBoundControl.PerformDataBinding, когда адаптер элемента управления DataBoundControlAdapter подключен к элементу управления, производному от класса DataBoundControl.

Что вообще не происходитЛюбые идеи?

Вот в основном, как это работает.

BrowserFile:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter
          controlType="System.Web.UI.WebControls.ListBox"
          adapterType="SomeNameSpace.ListBoxDataAdapter" />
    </controlAdapters>
  </browser>
</browsers>

Адаптер:

namespace SomeNameSpace
{
    public class ListBoxDataAdapter : DataBoundControlAdapter
    {
        protected override void PerformDataBinding(System.Collections.IEnumerable data)
        {
            base.PerformDataBinding(data); // Not firing
        }
    }
}

На странице:

<asp:ListBox runat="server" ID="lbxStuff" DataSourceID="obsStuff" DataValueField="Value"
    DataTextField="Text></asp:ListBox>
<asp:ObjectDataSource runat="server" ID="obsStuff" TypeName="Test" SelectMethod="Get">
</asp:ObjectDataSource>

1 Ответ

1 голос
/ 03 февраля 2012

DataBoundControl (базовый класс для ListControl / ListBox) содержит метод PerformSelect, этот метод извлекает данные из адаптера (если он существует)

Но тот, кто (в Microsoft) , создавший ListControl, отверг метод PerformSelect и не включил адаптер в их переопределение, тем самым удалив адаптивность - благодаря этому вы не сможете просто создать свой собственный метод PerformDataBindingкак и предполагалось природой.

Не все потеряно, хотя в вашем DataBoundControlAdapter вы можете присоединить к методу привязки данных ListBox получить ObjectDataSource, извлечь данные «вручную», вызвать метод PerformDataBinding и затем отменить ObjectDataSource изповторный вызов (иначе все, что вы делаете, будет переопределено) .

Как видно из следующего уродливого "хака".

void listBox_DataBinding(object sender, EventArgs e)
{
    ObjectDataSource ods = listBox.DataSourceObject as ObjectDataSource;
    if (ods != null)
    {
        IEnumerable data = ods.Select();
        PerformDataBinding(data);
        ods.Selecting += (s, ev) => { ev.Cancel = true; };
    }
}

Я почти склонен кскажем, что вам будет лучше "подклассифицировать" ListBox, нотак как вы используете адаптер, я думаю, это то, что вы на самом деле не хотите делать?

...