B
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 über
string 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