2009-08-06 35 views
3

我有一个GridView控件就像一个TemplateField:了解ObjectDataSource控件和选择参数

<asp:TemplateField ItemStyle-Width="150px"> 
    <ItemTemplate> 
     <asp:DropDownList ID="ddlFields" runat="server" DataSourceID="odsOperator" DataTextField="Text" DataValueField="Value" /> 
     <asp:HiddenField ID="hfFieldType" runat="server" Value='<%# Eval("FieldType")%>' /> 
    </ItemTemplate> 
</asp:TemplateField> 

我有我想从一个ObjectDataSource控件来填充下拉列表中,但对于每一行我想传递一个选择参数等等

:它与正确的价值观

<asp:ObjectDataSource ID="odsOperator" runat="server" TypeName="OperatorFieldsDAO" 
    SelectMethod="FindByType">  
    <SelectParameters> 
     <asp:ControlParameter ControlID="hfFieldType" Type="String" Name="Type" PropertyName="Value" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

我OperatorFieldsDAO类是填充

所有这一切都告诉你,我得到一个错误:

Could not find control 'hfFieldType' in ControlParameter 'Type'.

我在做什么错?

是否需要使用OnRowDataBound方法以编程方式传递所选参数?

回答

3

得到这个工作我添加创建两个方法(一个用于GridView和其他ObjectDataSource),以及将选择参数从ControlParameter更改为正常参数。

的想法是每一次设置参数它创建的行...

protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     DropDownList d = (DropDownList)e.Row.FindControl("ddlFields"); 
     string type = ((HiddenField)e.Row.FindControl("hfFieldType")).Value; 

     _type = type; 
     d.DataBind(); 
    } 
} 
protected void odsOperator_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) 
{ 
    e.InputParameters["Type"] = _type; 
} 

private string _type = ""; 

和ObjectDataSource控件将

<asp:ObjectDataSource ID="odsOperator" runat="server" TypeName="OperatorFieldsDAO" 
    SelectMethod="FindByType" onselecting="odsOperator_Selecting"> 
    <SelectParameters> 
     <asp:Parameter Type="String" Name="Type" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

我希望它能帮助任何人......

1

既然你:

<asp:HiddenField ID="hfFieldType" runat="server" .../> 

在您的视图的TemplateField,有可能是没有,有一个或网页上该领域的许多实例。因此hfFieldType不会是一个唯一的ID,事实上,实际的ID将在运行时确定。

因此,您的控制参数找不到它,因为它正在页面上某处称为hfFieldType的控件的属性中查找其值。

我在几年内没有使用ObjectDataSource,但我怀疑你可能想要挂钩到Selecting事件。

+0

感谢您点亮 – balexandre 2009-08-07 06:36:44

0

ObjectDataSource无法找到用于输入的控件,除非它在标记中靠近。数据源必须位于包含用于输入的控件的标签内。 这似乎是一个范围界定问题。

+0

欢迎使用计算器!如果可能的话,最好为您的解决方案提供一个示例代码,以提高发布的准确性:) – 2012-10-21 12:11:40