0

这是一个谜题。母版页上的数据源将其 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 的合理方法吗?

4

4 回答 4

0

您可以在子页面 .cs 文件中使用以下代码。

SqlDataSource ds = this.MasterPage.FindControl("datasourceid");
// now you can custimize this ds according to your problem
于 2013-05-31T07:21:34.000 回答
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 等。我以前从未遇到过这种行为,这可能来自主/子(/孙子)结构。希望这对其他人有帮助。

于 2013-05-31T08:24:18.777 回答
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

希望这会有所帮助,我曾经在您的情况下使用这种方式

于 2013-05-30T18:43:01.837 回答
0

恭喜你似乎能够解决这个问题。如果您允许您的用户使用一些不同的浏览器(例如:IE、Firefox、Chrome、Safari)。您可能需要检查cphMaster$cphChild$lblGrandChildA控件的生成 ID 是否相同,在某些浏览器中它会呈现为cphMaster_cphChild_lblGrandChildA下划线但如果您只允许您的用户仅使用一个浏览器,那么这将不是问题。

于 2013-05-31T12:39:58.710 回答