Не удается повторно привязать элемент управления FormView к обратной передаче

Привет!

У меня есть DropDownList в FormView, который привязан к XmlDataSources:

<asp:FormView ID="MyFormView" runat="server" DataSourceID="MyXmlDataSource">
    <ItemTemplate>
        <h1><%# XPath("SomeNode")%></h1>
        <asp:Label ID="MyLabel" runat="server" AssociatedControlID="MyDdl" Text='<%# XPath("SomeOtherNode")%>' />
        <asp:DropDownList ID="MyDdl"
                          runat="server"
                          DataSourceID="MyDdlDataSource"
                          DataTextField="name"
                          DataValueField="value"
                          AutoPostBack="true"
                          OnSelectedIndexChanged="MyDdl_SelectedIndexChanged">
        </asp:DropDownList>
    </ItemTemplate>
</asp:FormView>
<asp:XmlDataSource ID="MyXmlDataSource" runat="server" XPath="Root/MainSection" />
<asp:XmlDataSource ID="MyDdlDataSource" runat="server" XPath="Root/MainSection/Areas/*" />

В отделенном коде страницы у меня есть следующий метод OnLoad(), а также метод для получения раскрывающегося списка выбранных значений во время обратной передачи:

private m_key;

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    string xml_data;
    if (!IsPostBack)
    {
        xml_data = GetMyXml(0); // default value
        MyXmlDataSource.Data = xml_data;
        MyDdlDataSource.Data = xml_data;
    }
    else
    {
        GetSelections();
        xml_data = GetMyXml(m_key);
        MyXmlDataSource.Data = xml_data;
        MyXmlDataSource.DataBind();
    }
}

private void GetSelections()
{
    DropDownList l_MyDdl = FindMyControl<DropDownList>("MyDdl");
    if (l_MyDdl != null)
        if (!Int32.TryParse(l_MyDdl.SelectedItem.Value, out m_key))
            m_key = 0;
}

Все отлично работает, вплоть до постбэка в результате изменения выпадающего списка. Когда это происходит, я получаю значение выбранного элемента в раскрывающемся списке, передаю его моему методу GetMyXml() со значением из раскрывающегося списка в качестве параметра, а затем устанавливаю источник данных FormView для недавно возвращенных XML-данных из GetMyXml( ). Я просмотрел значение «xml_data» во время обратной передачи, и оно определенно правильное. Однако значения, отображаемые на странице FormView (например, XPath("SomeNode")), являются значениями до того, как произошла обратная передача, а не возвращенными в xml_data. Почему это может произойти и как мне решить эту проблему? Заранее спасибо.


person Bullines    schedule 11.12.2008    source источник


Ответы (3)


для автоматического повторного связывания вы должны включить ViewState для этого элемента управления.

person craigmoliver    schedule 29.12.2008

Вам не нужно вручную привязывать данные в коде coe, когда вы используете объект DataSource. Реализуйте событие OnSelecting источника данных и вызовите GetSelections в этом методе.

Редактировать: я был слишком быстр здесь. XmlDataSource не создает событие OnSelecting. У него есть OnDataBind, но здесь аргументом события является просто стандартный EventArg, поэтому я не знаю, как вы будете привязывать к нему результат из GetSelections. Прости

person Jan Aagaard    schedule 04.12.2009

Вы можете попробовать MyFormView.DataBind() после MyXmlDataSource.DataBind();

person sirrocco    schedule 11.12.2008
comment
По какой-то причине я получаю исключение нулевой ссылки, когда пытаюсь это сделать. С чего бы это? - person Bullines; 11.12.2008
comment
Я не совсем уверен, вы должны обновить вопрос, чтобы отразить это. Может у кого есть ответ. - person sirrocco; 12.12.2008