GridView不从UpdatePanel中的DropDownList的SelectedIndexChange事件更新

时间:2014-04-12 06:51:41

标签: c# asp.net gridview drop-down-menu updatepanel

我的问题:

UpdatePanel包含DropDownList和GridView。 GridView基于存储在Label中的值和从DropDownList中选择的值进行填充。它不会填充在PageLoad上;它仅在存在查询字符串或按下按钮时填充,因此!IsPostBack中没有代码。 GridView填充了DropDownList的初始SelectedValue,我希望GridView在DropDownList的SelectedValue更改时重新填充。

事情是......它会改变!但只有一次。 GridView最初使用DropDownList的默认SelectedValue值填充数据。更改SelectedValue时,GridView中的数据会更改。但只有一次。第二次或更多次更改DropDownList值后,没有任何反应。

<asp:UpdatePanel runat="server" ID="theUpdatePanel" UpdateMode="Conditional" ChildrenAsTriggers="True">
    <ContentTemplate>
        <asp:DropDownList runat="server" ID="theDropDownList" OnSelectedIndexChanged="theDropDownList_OnSelectedIndexChanged" EnableViewState="true" AutoPostBack="true" />
        <asp:GridView ID="theGridView" runat="server" AutoGenerateColumns="False">
            <Columns>
                ...
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

theUpdatePanel的UpdateMode是Conditional,所以当它的子节点PostBack时它会更新。 ChildrenAsTriggers是真的,所以孩子们会让它更新。

theDropDownList的AutoPostBack为true,因此它会在更改时回发。 EnableViewState为true(false使其甚至不加载)。 SelectedIndexChange链接到正确的函数,我知道在调试模式期间通过在其中放置一个中断来调用它。

这是SelectedIndexChanged方法:

public void theDropDownList_OnSelectedIndexChanged(object sender, EventArgs e)
{
    //get value that is stored in theLabel - I know this value is correct every time
    int theValueFromTheLabel = Int32.Parse(theLabel.Text);

    //populate theGridView with data from the DB
    theGridView_Populate(theValueFromTheLabel);

    //update theUpdatePanel (it works for the first change whether this line is here or not)
    theUpdatePanel.Update();
}

我尝试使用和不使用updatepanel.Update();方法,结果相同:第一次更改了DropDownList的值,并且每次后续更改都不起作用。

实际填充GridView的功能非常简单:

protected void theGridView_Populate(int theValueFromTheLabel)
{
    //get value from theDropDownList - this value does change when theDropDownList's value changes
    int theValueFromTheDropDownList = Int32.Parse(theDropDownList.SelectedValue);

    //get data from DB - the data here does change every time theDropDownList's value changed
    ComplexClassController controller = new ComplexClassController();
    List<ComplexClass> data = controller.GetData(theValueFromTheLabel, theValueFromTheDropDownList);

    //load theGridView - this changes the data, but doesn't refresh theGridView to be able to see it
    theGridView.DataSource = data;
    theGridView.DataBind();
}

有什么想法吗?我必须误解UpdatePanel背后的事件。

4 个答案:

答案 0 :(得分:0)

什么是valueLabel?看起来好像没有改变过吗?

为什么不做((DropDownList)发送者).selectedValue来获取你的值来重新映射gridview?

千电子伏

答案 1 :(得分:0)

似乎没有从下拉列表中获取价值的任何问题,原因可能在于您的组合数据来源

放入组合的加载!页面加载事件的回发这样的事情

 protected void Page_Load(object sender, EventArgs e)
    {
    if(!ispostback){
       Loadcomobo();
    }
    }

如果不是这样,那么你可以在这里放置你的页面加载事件代码 感谢...

答案 2 :(得分:0)

我仍然不确定为什么它会更新一次,然后又不会再次更新,但问题已经通过将DropDownList和GridView放在他们自己的UpdatePanel而不是同一个中来解决。

答案 3 :(得分:0)

尝试向更新面板添加触发器

<triggers>
    <asyncpostback ControlID="theDropDownList" />
</triggers>

之前的类似内容
</asp:UpdatePanel>