Pergunta

Eu tenho em um controle GridView um 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>

Eu tenho uma lista suspensa que eu quero para preencher a partir de um ObjectDataSource, mas para cada linha que eu quero passar um Select parâmetro para que ele preenche com os valores corretos

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

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

tudo isso para dizer-lhe que eu recebo um erro:

Não foi possível encontrar o controle 'hfFieldType' em 'Tipo' ControlParameter.

O que estou fazendo de errado?

Eu preciso programaticamente passar esse parâmetro selecionado usando o OnRowDataBound método?

Foi útil?

Solução

para começar este trabalho eu adiciono para criar dois métodos (um para o GridView e outros para o ObjectDataSource), bem mudar a Select parâmetro de um ControlParameter a um parâmetro normal.

A idéia é definir o parâmetro de cada vez que a linha é criado ...

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

eo 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 ajude alguém ...

Outras dicas

Uma vez que você tem:

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

Dentro de um TemplateField do seu ponto de vista, pode haver nenhuma, uma ou várias instâncias desse campo na página. Portanto hfFieldType não seria uma identificação única, na verdade, a ID real será determinada em tempo de execução.

Assim, o seu parâmetro de controle não pode encontrá-lo, uma vez que está à procura de seu valor em uma propriedade de um controle chamado em algum lugar hfFieldType na página.

Eu não tenho trabalhado com ObjectDataSource dentro de alguns anos, mas eu suspeito que você pode querer ligar para o Selecionar evento .

ObjectDataSource não consegue encontrar o controle que está sendo usado para entrada a menos que seja por perto na marcação. A fonte de dados tem de estar dentro da etiqueta que contém o controlo utilizado para a entrada. Parece ser um problema de definição do âmbito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top