2009-01-22 11 views
6

Ich habe eine ListView, die an eine LinqDataSource bindet und ausgewählte Positionen anzeigt. Das Einfügeelement enthält eine Dropdown-Liste, die von einer anderen LinqDataSource abgerufen wird, um alle nicht ausgewählten Positionen anzugeben.Binden einer DropDownList in ListView InsertItemTemplate, das einen Fehler verursacht

Das Problem ist, dass ich die folgende Fehlermeldung erhalten, wenn die Seite geladen wird:

Datenbindung Methoden wie eval(), XPath() und Bind() kann nur im Rahmen einer Databound-Steuerung verwendet werden.

Ich mache eine sehr ähnliche Einrichtung in einer anderen Seite der Website, und es gibt uns diesen Fehler nicht, also bin ich ziemlich verwirrt. Ich weiß, dass ich das umgehen kann, indem ich nicht verbindlich bin, manuell die Kontrolle finde und den Wert bekomme, aber das sollte funktionieren und ich verstehe nicht, warum es nicht so ist.

Irgendwelche Gedanken?

Der bessere Teil des Quellcodes ist unten.

<asp:LinqDataSource ID="ldsLocations" runat="server" 
    ContextTypeName="ClearviewInterface.ESLinqDataContext" EnableDelete="true" EnableInsert="true" 
    OnInserting="ldsLocations_Inserting" OnDeleting="ldsLocations_Deleting" 
    TableName="crmLocations" OrderBy="addr1" OnSelecting="ldsLocations_Selecting" /> 

<asp:LinqDataSource ID="ldsFreeLocations" runat="server" 
    ContextTypeName="ClearviewInterface.ESLinqDataContext" OrderBy="addr1" 
    TableName="v_CVLocations" OnSelecting="ldsFreeLocations_Selecting" /> 

<asp:ListView ID="lvLocations" DataSourceID="ldsLocations" DataKeyNames="ID" InsertItemPosition="LastItem" runat="server" > 

<InsertItemTemplate> 
     <tr> 
      <td colspan="6"><hr /></td> 
     </tr> 
     <tr> 
      <td colspan="2"> 

       <asp:DropDownList ID="ddlFreeLocations" DataSourceID="ldsFreeLocations" DataTextField="addr1" 
             DataValueField="record" MarkFirstMatch="true" SelectedValue='<%# Bind("record") %>' 
             runat="server" /> 
      </td> 
      <td><asp:ImageButton ID="btnAdd" CommandName="Insert" SkinID="Insert" runat="server" /></td> 
     </tr> 

    </InsertItemTemplate> 
+0

Bind in Dropdown des SelectedValue nicht funktioniert funktionieren wird, wenn in Dropdownlist Listview ist ... wie Sie sagten, Sie in einer anderen Website gleiche Setup haben, das ist funktioniert ... hast du dropdown nur in Listview oder in formview oder gridview platziert ??? Ich suchte auch viele Blogs, da ich das gleiche Problem bekomme. aber ich habe nur eine lösung gefunden. Verwenden Sie Eval, um den Wert anzuzeigen und "Einfügen" oder "Aktualisieren" Code in ItemInserting und itemUpdating – Radhi

+0

tun, wenn Sie eine Lösung finden. binding in dropdown in listview zu machen ... bitte gib es mir auch zu ... – Radhi

Antwort

2

Werfen Sie einen Blick auf diesen Thread http://forums.asp.net/t/1187425.aspx

Grundsätzlich können Sie nicht Bind-Syntax verwenden, da Steuerelemente in InsertItemTemplate sind "one-way" nur. Verwenden Sie den Code, um die Werte zu erhalten.

0

Ich hatte ein ähnliches Problem. Versuchen Sie, #Eval anstelle von zu verwenden, wenn Sie den Wert dieses Felds nicht aktualisieren.

5

Wie auf Joteke's Blog erklärt, ist hier eine zitierte Lösung.

Verwenden Sie <%#Eval("field")%> Ausdruck, um das Steuerelement zu binden? Wenn Sie das zu <%#DataBinder.Eval(Container.DataItem,"field")%>, ändern, scheint das den Fehler zu beheben?

+0

Dieser Link löste mein Problem. Vielen Dank. –

+0

JA! Das war mein Problem, bei dem ich 'eval (666)' benutzte, um ein Untersteuerelement zu konstruieren, und einen Nullwert, der ein Wobbley auslöst. Ich benutzte das '<% # DataBinder.Eval (Container.DataItem," field ")%>,' und es löste das Problem, weil dann meine Unterkontrolle den Nullpunkt behandelte und nicht wie ein betrunkener Moneky umfiel. PS Ich habe deine Antwort aktualisiert, weil Link-Only-Antworten schlecht sind ... die Dinge hinter dem Link könnten eines Tages verschwinden. – ppumkin

0

Ich habe es geschafft. Ich habe eine Formview mit einer SqlDataSource und in der Formularansicht gibt es eine Dropdown-Liste mit einer SQLdataSource.

Wenn ein neuer Datensatz angefordert wird, erstelle ich erneut die Auswahlbefehle für beide Datenquellen - die Dropdown-Liste Quelle bietet eine Liste von Optionen, während die Formview-Datenquelle nichts zurückgibt.

Dann verwende ich DataBind() sowohl in der Formview und der Dropdown-Liste und alles ist gut.

Ich bin neu in ASP.Net, aber das ist für mich arbeiten und mir erlaubt, zu tun, was ich will - Verwendung Bind auf der Dropdownlist und die Textfelder auf dem Formview

Ich hoffe, das hilft Nathan

0

Mit #Eval kann es sinnvoll sein, DataBinder.Eval() zu verwenden, um sicherzustellen, dass die Bindung zur richtigen Zeit erfolgt.

1

Für eine solche Situation können wir die folgenden Beschlüsse berücksichtigen:

  1. Für innere verschachtelte Steuerelemente, statt Datenbindung, wir andere Methoden verwenden, seine Produkte zu füllen. Zum Beispiel können wir eine for-Schleife verwenden, um Elemente in die Dropdown-Liste anstatt Datenbindung hinzuzufügen. Daher wird der <% # ...%> Ausdruck nicht ausgewertet.

  2. Wir können auch Änderungen am Container-DetailsView-Steuerelement vornehmen. Anstelle von <% #%> Ausdruck können wir manuell ein Ereignis wie "RowDataBound" verwenden, um das Datenelement zum bestimmten inneren Steuerelement zu füllen. Und beim Aktualisieren/Einfügen extrahieren Sie die Werte manuell aus den Steuerelementen des entsprechenden Ereignisses (z. B. ItemUpdating oder ItemInserting ...).

Quelle: http://blogs.msdn.com/b/stcheng/archive/2009/01/15/aspnet-system-invalidoperationexception-databinding-methods-such-as-eval-xpath-and-bind-can-only-be-used-in-the-context-of-a-databound-control-error-in-nested-databinding-scenario.aspx

0

diese

protected void lstCompContctPerson_ItemCreated(object sender, RadListViewItemEventArgs e) 
     { 

     if ((e.Item != null) && (e.Item.ItemType == RadListViewItemType.InsertItem)) 
     { 
      System.Web.UI.Control ddlCompNames = e.Item.FindControl("ddlCompNames"); 

      (ddlCompNames as RadDropDownList).DataSource = (from _company in objshortcut.GetAllCompanies() 
      select new 
      { 
        CompanyID = _company.CompanyID, 
        CompContctName = _company.CompanyName 
      }).Distinct(); 

     } 
    } 
+0

Bitte erläutern Sie, warum das funktioniert – slecorne

Verwandte Themen