Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Moin,

Ich weiß wie ich meine Datenbank-Abfrage als Ergebnis in ein datagridviw packe und mittlerweile auch wie ich ein Dropdown-Feld zum gridview hinzufügen kann - aber jetzt wird es knifflig.

Ich habe eine normale Datenbank-Abfrage, die verknüpfe ich mit meinem Datagridview. Jetzt möchte ich aber das eine der abgefragten Spalten als Dropdownfeld angezeigt wird und natürlich mögliche Optionen beim anklicken als Dropdown angezeigt werden.

Soweit hier mal mein Versuch, ich habe mal ein Dropdownfeld mit 5 Auswahl-Möglichkeiten in denen aber überall nur "System.Data.DataRowVIew" steht statt dem eigentlichen Inhalt.

Aspx:

<asp:GridView ID="dataGridView1" runat="server" OnRowCommand="DataGridView1_RowCommand" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowDataBound="dataGridView1_RowDataBound">
                <AlternatingRowStyle BackColor="White" />
                <Columns>
                    <asp:ButtonField CommandName="Select" HeaderText="Editieren" ShowHeader="True" Text="Edit" ItemStyle-HorizontalAlign="Right">
                        <ItemStyle HorizontalAlign="Right"></ItemStyle>
                    </asp:ButtonField>
                    <asp:TemplateField HeaderText="Anteil(%)">
                        <ItemTemplate>
                            <asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
                <EditRowStyle BackColor="#7C6F57" />
                <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
                <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
                <RowStyle BackColor="#E3EAEB" />
                <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
                <SortedAscendingCellStyle BackColor="#F8FAFA" />
                <SortedAscendingHeaderStyle BackColor="#246B61" />
                <SortedDescendingCellStyle BackColor="#D4DFE1" />
                <SortedDescendingHeaderStyle BackColor="#15524A" />
            </asp:GridView>

Code behind:

protected void Page_Load(object sender, EventArgs e)
        {
            db = new Datenbank();
            db.Connect();
            MySqlDataAdapter da = db.Query("select id, name from mitarbeiter;");
            MySqlDataAdapter da2 = db.Query("select anteil from mitarbeiter;");
            DataTable dt = new DataTable();
            dt2 = new DataTable();
            da.Fill(dt);
            da2.Fill(dt2);

            dataGridView1.DataSource = dt;
            dataGridView1.DataBind();

            db.Disconnect();
        }

protected void dataGridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DropDownList ddl = (e.Row.FindControl("DropDownList1") as DropDownList);
                ddl.DataSource = dt2;
                ddl.Items.Add("0");
                ddl.Items.Add("25");
                ddl.Items.Add("50");
                ddl.Items.Add("75");
                ddl.Items.Add("100");
                ddl.DataBind();
            }            
        }

Kann mir jemand auf die Sprünge helfen? Google ist irgendwie nicht so hilfreich wie ich erhofft hatte...

 

Tician

Bearbeitet von Tician

Ich weiß nicht, wie's in WebForms ist, aber in allen mir bekannten Frameworks kannst du entweder ein Binding definieren oder per Hand Items hinzufügen. Dadurch, dass du deine DataSource auf dt2 setzt, sind die nächsten Zeilen (wahrscheinlich) wirkungslos.

Die Anzeige "System.Data.DataRowView" kommt daher, dass du als Items eben diese RowViews gebunden hast. Wenn du da was "richtiges" haben möchtest, solltest du entweder die Werte aus den Rows selektieren, die du anzeigen möchtest und die dann binden, oder aber gleich ein ViewModel erzeugen, das dir die Rows als "normale" Objekte darstellt.

 

 

  • Autor

Also ich habe die DB-Anfrage an die Tabelle geknüpft und eine Spalte mit Hyperlinks per Hand definiert (funktioniert auch - wenn ich die 2. Spalte, also die DropdownSpalte wieder lösche^^) und hinzugefügt, also das geht irgendwie schon.

Ein Bild des Datagridview ist im ANhang.

Ich denke ich mache es ganz anders und lass die Spalte ohne Dropdown ganz normal wie die anderen anzeigen und mach irgendwas extra um die Spalte zu editieren und wieder in die DB zu schreiben...

Unbenannt.PNG

Wenn du die Anteile 0, 25, 50, 75 und 100 mit in der Dropdownmenü haben willst, dann musst du diese in die DataTable packen und nicht direkt ins Dropdownmenü.

Ich bin zwar jetzt nun auch kein WebForms-Experte aber um den konkreten Wert anzuzeigen, anstatt "System.Data.DataRowView" reicht es evtl. schon die Eigenschaft DataTextField und DataValueField (damit der konkrete Wert ausgewählt wird) zu setzen. Also:

ddl.DataTextField = "anteil";
ddl.DataValueField = "anteil";

Ansonsten weiß er nicht, was er anzeigen soll und führt einfach auf dem Objekt die ToString()-Methode aus, was eben genau zu deinem Effekt führt.

Bearbeitet von Whiz-zarD

Mal ne ganz doofe Frage:

Wenn du die Anteile eh schon hard-coded machst, Anstatt diese aus der Tabelle auszulesen, warum nimmst du dann nicht gleich eine Enum dafür her.

Du stellst in deiner if Abfrage eine Datasource zur Verfügung, willst aber anschließend der DropDownList selber noch hardcoded Daten hinzufügen.

Ich kenne ja den ganzen Code nicht, mir erschließt sich aber nicht der Sinn dahinter.

  • Autor

Die Anteile sollten aus der Tabelle ausgelesen und angezeigt werden, allerdings sollten hard-coded zusätzlich noch Auswahlmöglichkeiten erscheinen. Mir hat mal jemand versuch zu erklären was Enum sein soll aber verstanden habe ich es nicht.

Aber wie gesagt ich mach es jetzt ganz anders, die Tabelle wird mitsamt der 'Anteil'-Spalte normal angezeigt und ich bastel mir auf der "edit"-Seite etwas zusammen womit man das ändern kann - da kann es dann ein ganz normales Dropdown-Feld sein :)

 

vor 19 Minuten schrieb Tician:

Aber wie gesagt ich mach es jetzt ganz anders, die Tabelle wird mitsamt der 'Anteil'-Spalte normal angezeigt und ich bastel mir auf der "edit"-Seite etwas zusammen womit man das ändern kann - da kann es dann ein ganz normales Dropdown-Feld sein :)

Ich weiß jetzt nicht, was du dir jetzt davon versprichst. Die Problematik wird die selbe bleiben.

Bearbeitet von Whiz-zarD

  • Autor

Der Unterschied: Hier war erst der Plan die datagrid-Tabelle zu nehmen und die eine Spalte als Dropdown zu formatieren die gleichzeitig aus der Tabelle auslesen und reinschreiben kann.

Jetzt ließt es nur aus und bindet an die Tabelle - einfach. Bei einem Klick auf "edit" (die Hyperlink-Spalte) öffnet sich zum jeweiligen Mitarbeiter eine weitere Seite, dort werde ich ein ganz normales Dropdown-Feld (ohne Tabelle drum rum) nehmen, dieses auslesen und bei einem button-click oder eher select-change (oder wie immer das event heißt) einfach das jeweilige Feld in der Datenbank überschreiben / updaten. Ist mir gerade einfacher als mich weiter mit der Tabelle rumzuprügeln.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.