【问题标题】:Understanding ObjectDataSource and Select Parameters了解 ObjectDataSource 和 Select 参数
【发布时间】:2009-08-06 10:23:37
【问题描述】:

我在 GridView 控件中有一个 TemplateField,例如:

<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 类是:

public class OperatorFieldsDAO
{
    private List<OperatorField> OperatorFields
    {
        get
        {
            List<OperatorField> operatorFields = HttpContext.Current.Session["OperatorFields"] as List<OperatorField>;
            if (operatorFields == null)
            {
                operatorFields = new List<OperatorField>();
                operatorFields.Add(new OperatorField("string", "contains", "C"));
                operatorFields.Add(new OperatorField("string", "begins with", "BW"));
                operatorFields.Add(new OperatorField("string", "is equal to", "E"));
                operatorFields.Add(new OperatorField("string", "is not equal to", "NE"));
                operatorFields.Add(new OperatorField("string", "is less than", "L"));
                operatorFields.Add(new OperatorField("string", "is greater than", "G"));
                operatorFields.Add(new OperatorField("string", "is less than or equal to", "LE"));
                operatorFields.Add(new OperatorField("string", "is greater than or equal to", "GE"));
                operatorFields.Add(new OperatorField("string", "is from", "F"));
                operatorFields.Add(new OperatorField("string", "is between", "B"));
                operatorFields.Add(new OperatorField("string", "is nothing", "N"));
                operatorFields.Add(new OperatorField("string", "is something", "S"));

                operatorFields.Add(new OperatorField("number", "is the same as", "S"));
                operatorFields.Add(new OperatorField("number", "is not the same as", "S"));
                operatorFields.Add(new OperatorField("number", "is one of", "S"));
                operatorFields.Add(new OperatorField("number", "is not one of", "S"));
                operatorFields.Add(new OperatorField("number", "is nothing", "N"));
                operatorFields.Add(new OperatorField("number", "is something", "S"));
            }
            return operatorFields;
        }
    }
    public OperatorFieldsDAO() { }

    [DataObjectMethod(DataObjectMethodType.Select)]
    public IEnumerable<OperatorField> FindAll()
    {
        return this.OperatorFields;
    }

    [DataObjectMethod(DataObjectMethodType.Select)]
    public IEnumerable<OperatorField> FindByType(String type)
    {    
        List<OperatorField> r = new List<OperatorField>();

        foreach (OperatorField f in this.OperatorFields)
            if (f.Type == type)
                r.Add(f);

        return r;
    }
}

所有这些都是为了告诉你我收到了一个错误:

在 ControlParameter 'Type' 中找不到控件 'hfFieldType'。

我做错了什么?

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

【问题讨论】:

    标签: c# asp.net gridview objectdatasource


    【解决方案1】:

    为了让它工作,我添加了两个方法(一个用于 GridView,另一个用于 ObjectDataSource),并将 Select Parameter 从 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>
    

    希望对大家有帮助……

    【讨论】:

      【解决方案2】:

      因为你有:

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

      在您的视图的TemplateField 内,页面上可能没有该字段的一个或多个实例。因此hfFieldType 不会是唯一的ID,实际上真正的ID 将在运行时确定。

      因此,您的控件参数无法找到它,因为它正在页面某处名为 hfFieldType 的控件的属性中查找其值。

      我已经有几年没有使用 ObjectDataSource 了,但我怀疑你可能想加入 Selecting 事件。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 欢迎来到stackoverflow!如果可能的话,最好为您的解决方案提供示例代码以提高发布准确性:)
        猜你喜欢
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 2013-06-24
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多