asp:DataGrid mit Daten füllen
-
Hey,
ich bin grad dabei die Daten aus meiner SQL Datenbank irgendwie in ein DataGrid zu bringen. Aber irgendwie will das nich so wie ich will. Wenn ich den Code nehm, den ich HIER gefunden hab, dann stehn zwar Daten im Grid, aber meine Formatierung und alles was ich vorher in der ASPX definiert hatte is weg. Am Ende soll es dann in etwa so wie HIER aussehen.
So hab ich das DataGrid in der ASPX definiert:<asp:DataGrid ID="DG_AccountData" runat="server" BackColor="LightGoldenrodYellow" BorderColor="Firebrick" BorderWidth="1px" CellPadding="1" ForeColor="Black" GridLines="None" AllowSorting="True"> <FooterStyle BackColor="Tan" Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Strikeout="False" Font-Underline="False" /> <SelectedItemStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" /> <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" /> <AlternatingItemStyle BackColor="PaleGoldenrod" /> <HeaderStyle BackColor="Firebrick" Font-Bold="True" /> <Columns> <asp:BoundColumn HeaderText="Login"> <HeaderStyle Width="50px" /> </asp:BoundColumn> <asp:BoundColumn HeaderText="Name"> <HeaderStyle Width="50px" /> </asp:BoundColumn> <asp:BoundColumn HeaderText="Stadt"> <HeaderStyle Width="50px" /> </asp:BoundColumn> <asp:BoundColumn HeaderText="PLZ"> <HeaderStyle Width="50px" /> </asp:BoundColumn> <asp:BoundColumn HeaderText="Straße"> <HeaderStyle Width="50px" /> </asp:BoundColumn> <asp:BoundColumn HeaderText="Tel"> <HeaderStyle Width="50px" /> </asp:BoundColumn> <asp:BoundColumn HeaderText="eMail"> <HeaderStyle Width="50px" /> </asp:BoundColumn> <asp:EditCommandColumn CancelText="Abbrechen" EditText="Bearbeiten" UpdateText="Aktualisieren"> </asp:EditCommandColumn> <asp:ButtonColumn CommandName="Delete" Text="Löschen"> </asp:ButtonColumn> </Columns> </asp:DataGrid>
Den C#-Code hab ich mittlerweile wieder verworfen, denn der ging ja nich... Wäre echt toll, wenn mir da jmd helfen kann. Zumidest beim Ansatz.
MfG & Thx Bergmann.
-
Und wie bindest DU die Daten an das Grid?
Datasource?
DataTable?Woher soll das Grid wissen was Du wo rein haben möchtest.
-
Hey,
ich hab die Daten noch gar nich gebunden. Die Daten hab ich aus einer SQL-Datenbank in ein DataSet eingelesen (also DataTable). Un nun will ich die Daten in dem Grid darstellen. Aber nicht jede Spalte, aus der DataTable, sondern nur bestimmte. Und daran scheitere ich gerade.
MfG Bergmann.
-
Hey,
ich hab jetzt ma die Daten aus der Datenbank an das Grid gebungen:
DG_AccountData.DataSource = data.Table[0]
das geht nich. Im Browser zeigt es die Tabelle nich an. Also hab ich mir gedacht, ich erstell ma selber ne Tabelle (der Code is 1:1 aus dem MSDN kopiert):
DataTable table = new DataTable("table"); //Tabelle "table" anlegn DataColumn colItem = new DataColumn("item", //Spalte "item" anlegen Type.GetType("System.String")); table.Columns.Add(colItem); // Add five items. DataRow NewRow; for (int i = 0; i < 5; i++) { NewRow = table.NewRow(); NewRow["item"] = "Item " + i; table.Rows.Add(NewRow); } // Change the values in the table. table.Rows[0]["item"] = "cat"; table.Rows[1]["item"] = "dog"; table.AcceptChanges(); DG_AccountData.DataSource = table;
funktioniert aber auch nich. Ich bin echt ratlos. Hat den keiner Ahnung von den Dingern?
MfG Bergmann
-
Bist du sicher, dass du eine funktionierende Datenbank (welche?) korrekt ansprichst?
Auf welcher Plattform läuft deine ASP.NET-App?
Der hier abgebildete Code sieht ein wenig 'halbgar' aus ... mehr Informationen wären sicherlich hilfreich.
-
Hey,
ich hab den Fehler gefunden, aber ich kann mir nicht erklären warum:
DG_AccountData.DataSource = new DataView(data.Tables[0]); DG_AccountData.DataBind();
so gehts jetzt, aber ich hab auf mehreren Seiten auch nur
DG_AccountData.DataSource = data.Tables[0];
gesehen. Liegt das vlt irgendwie an meinem PC oder so: WinXP SP3, VisualStudio 08, SQL Server 08?!
€: jetzt hab ich wieder andere Probleme, bei den ich nich weiter weiß. Am ende will ich ja sowas wie HIER. Ich hab den Code auch fast 1:1 kopiert, aber es will nicht so wie ich will. Erstma mein Code:
public partial class ChangeCustomerForm : System.Web.UI.Page { /*aktuallisiert das DataGrid mit den daten aus der Datenbank*/ private void updateDataGrid(){ DataSet data; using (Database db = new Database()) { data = db.executeSelectCommand( "SELECT * FROM consumer;" ); } data.Tables[0].Columns[0].ColumnName = "CNR"; data.Tables[0].Columns[1].ColumnName = "Firmenname"; data.Tables[0].Columns[2].ColumnName = "Postleitzahl"; data.Tables[0].Columns[3].ColumnName = "Stadt"; data.Tables[0].Columns[4].ColumnName = "Straße"; data.Tables[0].Columns[5].ColumnName = "Telefon"; data.Tables[0].Columns[6].ColumnName = "eMail"; DG_AccountData.DataSource = new DataView(data.Tables[0]); DG_AccountData.DataBind(); } protected void Page_Load(object sender, EventArgs e) { updateDataGrid(); InfoLabel.Visible = true; InfoLabel.Text = ""; } /*Event wenn der löschen-LinkButton geklickt wurde*/ protected void DG_AccountData_DeleteCommand(Object sender, DataGridCommandEventArgs e) { string cnr = e.CommandArgument.ToString(); int answer = 0; using (Database db = new Database()) { answer = db.executeActionCommand( "DELETE FROM consumer WHERE (CNR = '"+cnr+"')" ); } if (answer > 0) { InfoLabel.ForeColor = Color.Green; InfoLabel.Text = "Konto wurde erfolgreich gelöscht"; } else { InfoLabel.ForeColor = Color.Red; InfoLabel.Text = "Konto konnte nicht gelöscht werden"; } updateDataGrid(); } /*Event wenn bearbeiten-LinkButton geclickt wurde*/ protected void DG_AccountData_EditCommand(Object sender, DataGridCommandEventArgs e) { DG_AccountData.EditItemIndex = e.Item.ItemIndex; //DG_AccountData.SelectedIndex = e.Item.ItemIndex; updateDataGrid(); ((LinkButton)e.Item.Cells[0].Controls[0]).CommandArgument = e.CommandArgument.ToString(); ((LinkButton)DG_AccountData.Items[e.Item.ItemIndex].Cells[0].Controls[0]).CommandArgument = e.CommandArgument.ToString(); //e.CommandArgument.ToString() = "K001" } /*Event wenn Aktuallisieren-LinkButton geklickt wurde*/ protected void DG_AccountData_UpdateCommand(Object sender, DataGridCommandEventArgs e) { //CommandArgument auslesen string orig_cnr_0 = e.CommandArgument.ToString(); //= "" ?! //CommandArgument des übergebenen Items auslesen string orig_cnr_1 = ((LinkButton)e.Item.Cells[0].Controls[0]).CommandArgument; //= "" ?! //CommandArgument direkt aus der Tabelle lesen (mit Index des übergebenen Items) string orig_cnr_2 = ((LinkButton)DG_AccountData.Items[e.Item.ItemIndex].Cells[0].Controls[0]).CommandArgument; //= "" ?! //Kundennummer direkt aus der Tabelle lesen string orig_cnr_3 = DG_AccountData.Items[e.Item.ItemIndex].Cells[2].Text; //= "" ?! string cnr = ((TextBox)e.Item.Cells[2].Controls[0]).Text; string compName = ((TextBox)e.Item.Cells[3].Controls[0]).Text; string postCode = ((TextBox)e.Item.Cells[4].Controls[0]).Text; string loca = ((TextBox)e.Item.Cells[5].Controls[0]).Text; string street = ((TextBox)e.Item.Cells[6].Controls[0]).Text; string phone = ((TextBox)e.Item.Cells[7].Controls[0]).Text; string mail = ((TextBox)e.Item.Cells[8].Controls[0]).Text; DataSet data; using (Database db = new Database()) { data = db.executeSelectCommand( "SELECT * FROM consumer WHERE ("+ "cnr != '" + cnr + "' AND " + "compName = '" + compName + "' AND " + "postCode = '" + postCode + "' AND " + "loca = '" + loca + "' AND " + "street = '" + street + "'" + ");" ); } if (data.Tables[0].Rows.Count > 0) { InfoLabel.ForeColor = Color.Red; InfoLabel.Text = "Konto konnte nicht aktuallisiert werden, " + "da die Kontodaten bereits bei einem anderen Konto verwendet werden!"; } else { InfoLabel.ForeColor = Color.Green; InfoLabel.Text = "Konto wurde erfolgreich aktuallisiert"; } DG_AccountData.EditItemIndex = -1; DG_AccountData.SelectedIndex = -1; updateDataGrid(); } /*Event wenn Abbrechen-LinkButton geklickt wurde*/ protected void DG_AccountData_CancelCommand(Object sender, DataGridCommandEventArgs e) { DG_AccountData.EditItemIndex = -1; DG_AccountData.SelectedIndex = -1; updateDataGrid(); } /*Event wenn neues Item/neue Reihe hinzugefügt wird*/ protected void DG_AccountData_ItemDataBound(Object sender, DataGridItemEventArgs e) { if ((e.Item.ItemType == ListItemType.AlternatingItem) || (e.Item.ItemType == ListItemType.Item)) { ((LinkButton)e.Item.Cells[0].Controls[0]).CommandArgument = ((DataRowView)e.Item.DataItem)[0].ToString(); } } }
1. Problem: Das CommandArgument ist im UpdateCommand-EventHandler leer, obwohl es im EditCommand-EventHandler richtig übergeben wurde. Habs ja sogar auf 2 verschiedenen Arten probiert wie man sieht. Im CommandArgument soll die KundenNummer stehen. Ich hab wie man sieht auch schon anders versucht an die Kundennummer ran zu kommen, aber die is jedesmal leer -.-
2. Problem: Im UpdateCommand-EventHandler sollte ich ja eig überstring compName = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
an den Text in den Textboxen kommen. Aber compName enthält immer den alten Namen, der vorher im Grid stand, und nich den geänderten, der in der Textbox steht.
Ich blick da nich mehr durch, ich sitz jetz schon fast 2 Stunden davor un vergleich immer wieder den Code auf der Seite von oben mit meinem, und ich kann einfach keinen Fehler finden. Is der Code auf der Seite vlt irgendwie veraltet?€2: Ok, hab dafür auch ne Lösung: ich hab im Page_Load immer das DataGrid aktuallisiert, un da hat er das CommandArgument immer iwie mit überschieben. Jetzt hab ich n Button, mit dem ich die Daten lade. Das is aber unschön, gibts nich irgendein Event, was aufgerufen wird, wenn ich von ner anderen Seite auf die mit dem Grid wechsle?!
MfG Bergmann