Frage

Ich habe eine Gridview, die bindet an ein ObjectDataSource-Klasse (objStudentDetails).Im edit - /Einfüge-Modus des Gridview-Steuerelements eines der Felder ist eine DropDownList, der es bekommt die Auswahlliste Optionen aus einer lookup-Tabelle.Ich habe das DropDownList-die Bindung an eine andere ObjectDataSource-Steuerelement (objStateList) das entspricht der lookup-Tabelle.Es funktioniert gut, solange der Wert in der objStudentDetails ObjectDataSource mit einem der Werte in der objStateList ObjectDataSource, zumindest in dem Fall von einer nicht leeren string-Wert sowieso.

Die objStateList hat diese Werte (aus dem gespeicherten proc, lädt es - ID#6 ist ein leeres string "):

StateId     State
----------- -----
6             
4           AL
1           GA
3           KY
2           TN

Die objStudentDetails hat diese Werte (aus dem gespeicherten proc, lädt es):

FirstName   LastName   State
----------- ---------- -----
tone        smith      TN

Oder hätte es dieses Ergebnis gesetzt (Zustand ein leerer string - "):

FirstName   LastName   State
----------- ---------- -----
jenny       johnson     

In der ersten objStudentDetails resultset der Staat DropDownList in der EditItemTemplate shows up fine.In der zweiten Ergebnismenge enthalten, allerdings bekomme ich diesen Fehler:

'ddlEditState' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value 

Ich glaube, Sie ist da meine lookup-Tabelle hat einen Wert mit einer leeren Zeichenfolge zu, dass die objStudentDetails Wert mit einer leeren Zeichenfolge für den Staat würde passen, aber etwas nicht so funktioniert, wie ich erwarte es.

Hier ist mein EditItemTemplate code aus dem Gridview:

<EditItemTemplate>
  <asp:Panel ID="panEditState" runat="server">
    <asp:DropDownList ID="ddlEditState" runat="server" CssClass="GridviewDropdownlist"
      DataSourceID="objStateList" DataTextField="State" DataValueField="State"      
      SelectedValue='<%# Bind("State") %>'
      Width="50px">
</asp:DropDownList>
</asp:Panel>
</EditItemTemplate>

Und die objStateList, die fordert, eine Methode, die einen parameter übergeben, der die lookup-Tabelle-Abfrage:

<asp:ObjectDataSource ID="objStateList" runat="server" SelectMethod="GetDropdownData"     TypeName="AIMLibrary.BLL.DropdownData">
<SelectParameters>
<asp:Parameter Name="itemsToGet" DefaultValue="state" />
</SelectParameters>
</asp:ObjectDataSource>

Irgendwelche Ideen?

War es hilfreich?

Lösung

Starten Sie durch beide Dropdownlists AppendDataBoundItems Eigenschaft auf true setzen. Als nächstes wird durch Hinzufügen des folgenden <asp:ListItem> Element zu jedem Dropdown den NULL ListItem hinzufügen, so dass das deklarative Markup wie folgt aussieht:

<asp:DropDownList ID="Categories" runat="server"
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
    AppendDataBoundItems="True">
    <asp:ListItem Value="">[nothing selected]</asp:ListItem>
</asp:DropDownList>

Andere Tipps

Ich vermute, es gibt viele verschiedene Szenarien, die diesen Fehler verursachen können.In meinem Fall hatte ich eine drop-down-platziert in einem Feld Vorlage.Die drop-down-war gebunden an seine eigenen objectdatasource, und seine selectedvalue-Eigenschaft gebunden waren, um ein Feld aus der gridview eigenen (separaten) datasource.

Jetzt, mit meinem spezifischen Szenario, das problem war eine race-Bedingung.Die gridview datasource wurde aufgefüllt und gebunden VOR den dropdowns hatten Ihre umdrehung.Dies bedeutete auch, dass die dropdowns' selectedvalues wurden VOR dem Aufklappmenü' Elemente wurden geschaffen, die durch Ihre eigene Bindungen.

Ich bin sicher, es muss eine bessere Lösung, aber ich habe nicht viel Zeit für die Forschung.Ich mich getrennt, die gridview und die dropdowns aus Ihren Datenquellen (d.h. entfernen der Zuweisungen aus dem designer) und entschied sich binden programmgesteuert.So kann ich explizit binden die dropdowns also, dass Ihre Produkte' werden die Werte zur Verfügung, wenn die gridview selbst gebunden ist.

So weit, So gut.Nur ein paar zusätzliche Zeilen code in der Page_Load -

AppendDataBoundItems = "true"> funktioniert, aber nicht in allen Fällen. Herstellung von Dropdownlist innerhalb Gridview ist immer noch ein Geheimnis, das Microsoft zu lösen hat. Sie sagen, die Entwicklung ist ASP ist viel schneller als PHP. Gut, das ist mein dritte Tag auf dieses kleine Problem und hat immer noch keine Lösung.

OK, da dies ist ein häufiges Problem, das ich seinen Wert erraten tatsächlich eine Antwort zu schreiben. Nach vielen umsah habe ich zwei Lösungen gefunden - na ja, ein Patch und eine echte

  1. Patchen: Stellen Sie die DDL Einstellung AppendDataBoundItem=true undeinem manuell hinzufügen ein Element der Liste (das heißt „Bitte wählen“ mit Nullwert):

       Bitte wählen                             

Dies scheint in etwa 80% der Fälle zu arbeiten. Ich hatte eine seltsame Situation, wenn ich ein Upgrade musste bestehenden (und arbeiten) Abfrage von DDL verwendet, um einen anderen Wert des Parameters zu erlauben - Abfrage war etwas ähnliches wie SELECT ID, Name from EMPLOYEES where Department =@Department und ursprünglich @Department konnte nur gleich „Planer“ und „Workshop“ - nach dem Hinzufügen „Logistik“ DDL gestoppt geheimnisvoll NUR für den neuen Wert der Abteilung arbeiten.

  1. Die richtige Lösung: Binden Sie die DDL während des GridView_RowDataBound Ereignisses (Quelle dank Dieser Artikel

Meine Parameter werden als Text aus dem Etikett (set up woanders)

genommen
    protected void GridView5_RowDataBound(object sender, GridViewRowEventArgs e)
    {

    //********** this  is a workaround for the annoying problem with dropdownlist in gidview without adding new item ************
    if (e.Row.RowType == DataControlRowType.DataRow && GridView5.EditIndex == e.Row.RowIndex)
    {
        DropDownList DropDownList5 = (DropDownList)e.Row.FindControl("DropDownList5");
        string query = "SELECT gkey as empID, name FROM [employees] where department=@department";
        SqlCommand command = new SqlCommand(query);
        command.Parameters.AddWithValue("@department", lblDepartment.Text);
        DropDownList5.DataSource = GetData(command);
        DropDownList5.DataTextField = "name";
        DropDownList5.DataValueField = "empID";
        DropDownList5.DataBind();
    }

Und die GetData-Methode:

   private DataTable GetData (SqlCommand cmd)
{
    string strConnString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(strConnString))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            sda.SelectCommand = cmd;
            using (DataTable dt= new DataTable())
            {
                sda.Fill(dt);
                return dt;
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top