Pregunta

Tengo un GridView en el control TemplateField como:

<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>

Tengo un desplegable que quiero llenar de un ObjectDataSource, pero para cada línea quiero pasar a Seleccione Parámetro por lo que se llena con los valores correctos

<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 mi clase es:

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;
    }
}

todo esto para decirle que me da un error:

  

No se pudo encontrar el control 'hfFieldType' en ControlParameter 'Tipo'.

¿Qué estoy haciendo mal?

¿Es necesario pasar programáticamente ese parámetro seleccionado con el método OnRowDataBound?

¿Fue útil?

Solución

para conseguir este trabajo agrego para crear dos métodos (uno para el GridView y otra para el ObjectDataSource), así cambiar la selección de un parámetro de una ControlParameter a un parámetro normal.

La idea es establecer el parámetro cada vez que la fila se la crea ...

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 = "";

y el ObjectDataSource será

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

espero que ayude a nadie ...

Otros consejos

Dado que usted tiene:

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

Dentro de un TemplateField de la vista, puede haber ninguna, una o muchas instancias de ese campo de la página. Por lo tanto hfFieldType no sería un identificador único, de hecho la ID real será determinado en tiempo de ejecución.

Así, su parámetro de control no puede encontrar, ya que está en busca de su valor en una propiedad de un control denominado hfFieldType lugar de la página.

No he trabajado con ObjectDataSource en unos pocos años, pero sospecho que es posible que desee conectar en el Selección evento .

ObjectDataSource no puede encontrar el control que se utiliza para la entrada a menos que sea muy cerca en el marcado. El origen de datos tiene que ser dentro de la etiqueta que contiene el control utilizado para la entrada. Parece ser un problema de alcance.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top