Laden...

DropDownList funktioniert nicht innerhalb DetailsView

Erstellt von FastJack vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.242 Views
F
FastJack Themenstarter:in
16 Beiträge seit 2007
vor 16 Jahren
DropDownList funktioniert nicht innerhalb DetailsView

Hallo,

ich habe mal wieder ein Problem:

Ich habe ein DropDown-Feld innerhalb meiner aspx Seite:
als Beispiel mal einfach eine Länderauswahl.

<asp:DropDownList ID="ddl_land" runat="server" DataTextField="Land" DataValueField="ID"/>

Die Daten stehen in einer SQL Datenbank, weshalb in der Codebehind-Datei die Daten ausgelesen werden und an das DropDownList gebunden werden.

Achtung: gekürzter Code, Aufbau der Datenbankverbindung habe ich weggelassen, hier nur der relevante Codeausschnitt.


            String SQL = "SELECT * FROM tab_laender;";
            SqlCommand cmd = new SqlCommand(SQL, conn);

            //Data-Adapter zur Aufnahme der Daten
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            DataSet dataset = new DataSet();
            adapter.Fill(dataset, "Laender");
            conn.Close();
            ddl_land.DataSource = dataset;
            DataBind();

Das funktioniert alles einwandfrei.
Wenn ich jedoch das DropDown-Feld innerhalb eines DetailsView platziere, bekomme ich eine Fehlermeldung:
Fehler: Der Name ddl_land ist im aktuellen Kontext nicht vorhanden.

            <asp:TemplateField>
                <ItemTemplate>
                    <asp:DropDownList ID="ddl_land" runat="server" DataTextField="Land" DataValueField="ID"/>
                </ItemTemplate>
            </asp:TemplateField>

Ich glaube, das hat mit den verschiedenen Renderstates zu tun, so dass es das DropDownList noch nicht gibt, wenn die Methode für die Datenanbindung aufgerufen wird (nämlich beim Page_Load), aber sicher bin ich mir da nicht.

Kennt sich jemand damit aus?

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo FastJack

Das TemplateField gibts aber im DetailsView nicht?
Allgemein:

<Control>.FindControl(<ControlID>)

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

F
FastJack Themenstarter:in
16 Beiträge seit 2007
vor 16 Jahren

Hallo, zum Verständnis, noch mal ein wenig mehr Code:

Code aspx-Seite (DetailsView):


   <asp:DetailsView ID="dv" runat="server" OnItemInserting="dv_insert" OnItemUpdating="dv_update" Height="50px" Width="125px" AutoGenerateRows="False" 
    DataKeyNames="ID" DefaultMode="Insert">
        <Fields>
            <asp:BoundField DataField="Vorname" HeaderText="Vorname" SortExpression="Vorname" />
            <asp:BoundField DataField="Nachname" HeaderText="Nachname" SortExpression="Nachname" />
            <asp:BoundField DataField="Strasse" HeaderText="Strasse" SortExpression="Strasse" />
            <asp:BoundField DataField="Hausnummer" HeaderText="Hausnummer" SortExpression="Hausnummer" />
            <asp:BoundField DataField="PLZ" HeaderText="PLZ" SortExpression="PLZ" />
            <asp:BoundField DataField="Ort" HeaderText="Ort" SortExpression="Ort" />
            <asp:BoundField DataField="Land_ID" HeaderText="Land_ID" SortExpression="Land_ID" />
           <asp:TemplateField>
                <ItemTemplate>
                    <asp:DropDownList ID="ddl_land" runat="server" DataTextField="Land" DataValueField="ID"/>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="EMail" HeaderText="EMail" SortExpression="EMail" />
            <asp:BoundField DataField="Username" HeaderText="Username" SortExpression="Username" />
            <asp:BoundField DataField="PW" HeaderText="PW" SortExpression="PW" />
            <asp:BoundField DataField="Beitritt" HeaderText="Beitritt" SortExpression="Beitritt" />
            <asp:BoundField DataField="Anmeldung" HeaderText="Anmeldung" SortExpression="Anmeldung" />
            <asp:CheckBoxField DataField="aktiv" HeaderText="aktiv" SortExpression="aktiv" />
            <asp:CommandField ShowEditButton="True" ButtonType="Button" ShowCancelButton="False" ShowInsertButton="True" />
        </Fields>
    </asp:DetailsView>

Code behind (nur relevante Ausschnitte):


public partial class edit_authors : System.Web.UI.Page
{
    //Standardpage
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) ExecuteDataBinding_dv();
        if (!IsPostBack) ExecuteDataBinding_ddl_land();
    }

    //Datenanbindung an das DropDown-Feld Land
    protected void ExecuteDataBinding_ddl_land()
    {
        //Datenbankverbindung
        //Eigenes Objekt zur Datenbankverbindung erstellen
        DBConn MyConnection = new DBConn();
        //Variable zum Speichern der Datenbankverbindung
        SqlConnection conn = new SqlConnection();
        //Objekt erstellt Datenbankverbindung
        conn = MyConnection.CreateConn();
        try
        {
            String SQL = "SELECT * FROM tab_laender;";
            SqlCommand cmd = new SqlCommand(SQL, conn);
            //Data-Adapter zur Aufnahme der Daten
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            DataSet dataset = new DataSet();
            adapter.Fill(dataset, "Laender");
            conn.Close();
            //DropDownList ddl_land = dv.FindControl("ddl_land") as DropDownList;
            DropDownList ddl_land = (DropDownList)dv.Rows[7].Cells[1].Controls[0];
            ddl_land.DataSource = dataset;

            DataBind();
        }
        catch (Exception ex)
        {
            lbl_error.Text = "Fehler SELECT:" + ex.Message;
        }
    }

Mit dem Code:

            DropDownList ddl_land = (DropDownList)dv.Rows[7].Cells[1].Controls[0];

bekomme ich die Fehlermeldung: (Das Objekt des Typs System.Web.UI.LiteralControl kann nicht in Typ System.Web.UI.WebControls.DropDownList umgewandelt werden.

MIt dem Code Find Controll:


DropDownList ddl_land = dv.FindControl("ddl_land") as DropDownList;

bleibt das DrowDown-Feld leer, weil Find Controll scheinbar nichts findet.

Das Problem habe ich allerdings nur, weil mein DrowDownFeld mitten im Details View sitzt. Platziere ich es außerhalb, dann funktioniert es so wie ich mir das vorstelle.

N
22 Beiträge seit 2008
vor 16 Jahren

Hallo,

es reicht nicht nur das ItemTemplate zu definieren. Dies wird nur erstellt wenn sich das DetailsView im Modus Readonly befindet. Für die anderen Modi musst du entsprechende Templates anlegen.

<EditItemTemplate>
<InsertItemTemplate>

usw.

In jedes Template muss deine ComboBox hinzugefügt werden.

Bsp.:


<asp:TemplateField>
  <ItemTemplate>
    <asp:DropDownList ID="ddl_land" runat="server" DataTextField="Land" DataValueField="ID"/>
  </ItemTemplate>
  <EditItemTemplate>
    <asp:DropDownList ID="ddl_land" runat="server" DataTextField="Land" DataValueField="ID"/>
  </EditItemTemplate>
  <InsertItemTemplate>
    <asp:DropDownList ID="ddl_land" runat="server" DataTextField="Land" DataValueField="ID"/>
  </InsertItemTemplate>
</asp:TemplateField>

F
FastJack Themenstarter:in
16 Beiträge seit 2007
vor 16 Jahren

Ok, danke für den Tip. Ist verständlich, wenn ich das Feld automatisch in ein Template Feld umwandeln lasse, dann macht VS das auch so. Allerdings löst das nicht mein eigentliches Problem.

N
22 Beiträge seit 2008
vor 16 Jahren

Musst du nicht die Tabelle an die DropDownList binden?

ddl.DataSource = dataSet.Tables["Laender"]; ?

Woher soll das ddl denn wissen das es den Inhalt aus Laender nehmen soll?

Oder gibt es dafür ein DefaultView?

N
22 Beiträge seit 2008
vor 16 Jahren

bleibt das DrowDown-Feld leer, weil Find Controll scheinbar nichts findet.

FindControl kann nichts finden wenn nicht entsprechende Templates mit dem Control vorhanden sind. Wenn dein View in Insert oder Update Modus ist, dann gibt es das Control nicht und es kann folglich auch nicht gefunden werden.