2009-08-06 2 views
3

ich in einem Gridview haben eine Template wie steuern:Verständnis Object und Parameter auswählen

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

Ich habe ein Drop-Down, die ich von einem Object auffüllen möchten, aber für jede Zeile möchte ich so einen Select Parameter übergeben es füllt mit den richtigen Werten

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

meine OperatorFieldsDAO Klasse:

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

all dies zu sagen, dass ich einen Fehler:

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

Was mache ich falsch?

Muss ich diesen ausgewählten Parameter mit der Methode OnRowDataBound programmatisch übergeben?

Antwort

3

um diese Arbeit zu bekommen Ich füge hinzu, um zwei Methoden zu erstellen (eine für die GridView und andere für die ObjectDataSource), sowie die Select Parameter von einem ControlParameter zu einem normalen Parameter.

Die Idee ist, die Parameter jedes Mal, um die Zeile zu setzen es erstellt wird ...

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

und die Object wird

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

Ich hoffe, dass es jemand hilft ...

1

Da Sie haben:

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

Innerhalb eines TemplateField Ihrer Ansicht nach kann es keine geben, eine oder mehrere Instanzen dieses Feld auf der Seite. Daher wäre hfFieldType keine eindeutige ID, vielmehr wird die tatsächliche ID zur Laufzeit ermittelt.

Ihr Steuerelementparameter kann es nicht finden, da es in einer Eigenschaft eines Steuerelements, das hfFieldType irgendwo auf der Seite aufgerufen wird, seinen Wert sucht.

Ich habe nicht mit ObjectDataSource in ein paar Jahren gearbeitet, aber ich vermute, Sie möchten vielleicht in das Ereignis einhängen.

+0

danke für das leuchten – balexandre

0

ObjectDataSource kann das für die Eingabe verwendete Steuerelement nicht finden, es sei denn, es befindet sich in der Markup in der Nähe. Die Datenquelle muss INSIDE innerhalb des Tags sein, das das für die Eingabe verwendete Steuerelement enthält. Es scheint ein Scoping-Problem zu sein.

+0

Willkommen bei stackoverflow! Es ist immer besser, einen Beispielcode für Ihre Lösung bereitzustellen, um die Postgenauigkeit zu verbessern. –