如果控件始终按照它们被声明的顺序绑定到数据源控件

时间:2009-04-07 19:34:55

标签: c# asp.net data-binding objectdatasource


A)以下问题基于这样的假设:控件总是按照声明的顺序绑定到数据源控件?因此在我们的示例中,SqlDataSource1将连接到SqlDataSource2之前的数据源,因此 lstCities 将在 GridView1 之前填充值,并且原因是 lstcities 是在 GridView1 之前声明的?!



B)如果是这样,那么 ControlParameter 究竟何时从 DropDownList 中检索一个值?我假设它是在 SqlDataSource1_Selected()事件处理程序之后和 SqlDataSource2_Selecting()事件处理程序之前,但是恰好是什么时候?

在.aspx页面:

    <asp:SqlDataSource ID="SqlDataSource1" ... >
    </asp:SqlDataSource>

    <asp:DropDownList ID="lstCities" DataSourceID="SqlDataSource1"
         DataTextField="City" runat="server"></asp:DropDownList>

    <asp:SqlDataSource ID="SqlDataSource2" ... >
        <SelectParameters>
            <asp:ControlParameter ControlID="lstCities" Name="City"
                 PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:SqlDataSource>

    <asp:GridView DataSourceID="SqlDataSource2" runat="server" …>
    </asp:GridView>


感谢名单

编辑:

  

如果它是回发,那么这些参数将从页面的OnLoadComplete上的视图状态再次按照声明的顺序加载。   

Q1 - 让我们假设ControlParameter绑定到控件C的属性C1。我想在回发时,ControlProperty始终能够从ViewState获取C.C1的值,无论C是什么类型,即使是C ViewState已禁用?!

Q2 - 但请问为什么,如果第一次创建页面,还不能从viewstate中检索ControlParameter的值?毕竟,当lstCities从数据源检索数据时,lstCities.SelectedValue的值是否已设置?



thanx mate


第二次编辑:

我很抱歉没有及早回复,但我没有意识到你已经回复了。当我这样做的时候,我花了20分钟试图让我的3个braincells正常工作,但我不确定我是否成功了


A)所以ControlParameter会评估C.C1,从而在C绑定后检索C.C1的值?!


  

Q1 - ControlParameter仅读取自己的状态,并仅确定它是否已更改

A)因此,ControlParameter在绑定发生之前检查其ViewState是否发生了更改(以便触发OnParameterChanged事件) - &gt;因此它在Page.OnLoadComplete期间检查其ViewState。 但是ControlParameter如何知道它的ViewState已经改变了(它会在第一次回发时知道)?毕竟,从第一次创建页面开始,ControlParameter的ViewState将始终被标记为脏,那么从一个回发到另一个回调,ControlParameter将如何知道它的值是否在回发之间发生了变化?

B)我假设ControlParameter检查它的Viewstate是否只是更改,以便它可以触发OnParameterChanged事件。但为什么处理这个事件如此重要?


  

首次进行财产评估是在Page.OnLoadComplete

通过属性评估,您的意思是ControlParameter检查自己的ViewState?因此,您并不意味着ControlParameter评估C.C1(我假设在C绑定后发生)


我真的很感谢你的帮助


第三次编辑:

我真的很抱歉再花时间。我会尽力把它作为我最后一次编辑。


在OnLoadComplete和数据绑定发生时都会调用Update()。在Update()中,还执行以下句子:

this.ViewState["ParameterValue"] = actualValue;

因此,如果在发生数据绑定时调用Update(),那意味着什么  在OnLoadComplete中调用下一个回发UpDate()时,C.C1和ControlParameter将具有相同的值,因此

             if ((actualValue == null && storedValue != null)
             || (actualValue != null && actualValue != storedValue))

将始终返回false(在OnLoadComplete中调用Update()时),因此OnParameterChanged事件永远不会被触发?1如果是这样,我看不到需要在OnLoadComplete中调用Update()!


非常有责任

1 个答案:

答案 0 :(得分:2)