无法在回发时重新绑定FormView控件

时间:2008-12-11 01:31:55

标签: c# asp.net xml data-binding formview

问候!

我在FormView中有一个DropDownList,它绑定到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的数据源设置为GetMyXml中新返回的XML数据( )。我在回发期间查看了“xml_data”的值,这绝对是正确的。但是,FormView页面上显示的值(如XPath(“SomeNode”))是回发之前的值,而不是xml_data中返回的值。为什么会发生这种情况,我将如何解决它?提前谢谢。

4 个答案:

答案 0 :(得分:1)

为了自动重新绑定,您必须在该控件上启用ViewState。

答案 1 :(得分:0)

您可以在MyFormView.DataBind()

之后尝试MyXmlDataSource.DataBind();

答案 2 :(得分:0)

formView.Databind();
this.page.databind();

答案 3 :(得分:0)

当您使用DataSource对象时,您不必在后面的代码中进行任何手动数据绑定。实现数据源的OnSelecting事件,并在该方法中调用GetSelections

编辑:我在这里太快了。 XmlDataSource不是OnSelecting事件。它有一个OnDataBind,但这里的event参数只是一个标准的EventArg,所以我不知道如何将GetSelections的结果绑定到它。遗憾