这是一个难题。母版页上的数据源将其SelectParameter引用到包含(宏)子页面上的一些文本的标签控件:
<asp:SqlDataSource ... SelectCommand="SELECT * FROM [tblMyTable] WHERE (([strField] = ?) ">
<SelectParameters>
<asp:ControlParameter Name="strField" ControlID="cphMaster$cphChild$lblGrandchild" propertyname="Text" DbType="String"/>
</SelectParameters>
</asp:SqlDataSource>
但这会产生错误(“System.Data.OleDb.OleDbException:条件表达式中的数据类型不匹配。”)
我已经检查过明显的(strField确实是一个字符串,ContentPlaceHolder(cph)控件通过其ID正确识别)。有任何想法吗?
我的基本方法是'ControlParameter读取放置在ContentPlaceholder(s)中的控件'是一种将值传递给SelectParameter的合理方法吗?
答案 0 :(得分:0)
我建议您在母版页类上创建一个类型为SQLDataSource的公共属性,可以访问您的子页面。
YourMasterPage.vb(母版的类名是YourMasterPage)
Private _mastersqldatasource as SqlDataSource
Public ReadOnly Property MasterSQLDataSource() As SqlDataSource
Get
Return SqlDataSource1
End Get
End Property
然后您可以访问您的子页面
dim myMasterPage as YourMasterPage
myMasterPage = DirectCast(Me.Page.Master, YourMasterPage)
myMasterPage.MasterSQLDataSource.SelectParameters("strField").DefaultValue = lblGrandChild.Text
希望这会有所帮助,我过去常常以这种方式使用
答案 1 :(得分:0)
您可以在子页面.cs文件中使用以下代码。
SqlDataSource ds = this.MasterPage.FindControl("datasourceid");
// now you can custimize this ds according to your problem
答案 2 :(得分:0)
事实证明我的方法很好。在我的实际应用程序中,我有几个标准,问题是SelectParameters与WHERE子句中的条件的顺序不同。当订单相同时,该方法有效。
所以:
SELECT * FROM [myTable] WHERE [FieldA] = ? AND [FieldB] = ? AND [FieldC] = ?
需要:
<SelectParameters>
<asp:ControlParameter Name="FieldA" ControlID="cphMaster$cphChild$lblGrandChildA .../>
<asp:ControlParameter Name="FieldB" ControlID="cphMaster$cphChild$lblGrandChildB .../>
<asp:ControlParameter Name="FieldC" ControlID="cphMaster$cphChild$lblGrandChildC .../>
</SelectParameters>
即,不是ACB等。我从未遇到过这种行为,这种行为可能来自主/子(/孙子)结构。希望这有助于其他人。
答案 3 :(得分:0)
祝贺您似乎能够解决问题。如果您允许用户使用某些浏览器(例如:IE,Firefox,Chrome,Safari)。
您可能需要检查 cphMaster$cphChild$lblGrandChildA
是否与控件的生成ID相同,在某些浏览器中,它将以呈现为 cphMaster_cphChild_lblGrandChildA
下划线,但如果您只允许您的用户只使用一个浏览器,则不会出现问题。