Mexican Seafood
Little Overclocker
|
Hallo.
Beschäftige mich nun schon seit ca. 1 Monat mit ASP.NET 2.0 und entwickle derzeit eine Applikation in der ich folgendes benötige:
Ein GridView mit mehreren Spalten, wobei eine Spalte in jeder Zeile 2 Textboxes zur Eingabe enthält (Stunden- und Minuten). Ich brauch keinen Edit-Button oder ähnliches, den ASP.NET bei AutoGenerateEditButton=true automatisch erzeugt. Die Eingabe ist sofort möglich.
Derzeit habe ich die Spalte mit den Textboxes mit TemplateField und ItemTemplate gelöst. Die Eingabe funktioniert auch, auch das DataBind() an die Textboxes funktioniert wunderbar (in einer Klasse die ItemTemplate implementiert ausprogrammiert).
Nun steh ich aber vor einem Problem: Wenn der User die Seite neu lädt/auf den OK-Button klickt, geht nicht nur der Inhalt der Textboxes, sondern auch die Textboxes selbst verloren. Alle anderen Inhalte der Gridview (deren Spalten keine Templates sind, sonder BoundColumns) bleiben erhalten.
Ich probier nun schon seit gut 2 Wochen eine Lösung zu finden und bin wirklich schon am Ende. Normalerweise bleiben ja alle Steuerelementinhalte in ViewState erhalten, nur die dynamisch im Code erzeugten gehen leer aus bzw. sind nicht einmal mehr vorhanden, obwohl im Container (GridView) alle anderen Werte zwischengespeichert werden (ViewState).
Code der Template-Klasse für die Textboxes:
public class GridViewTextBoxColumn : DefaultGridViewColumn, ITemplate { private DefaultPaymentList _container;
public GridViewTextBoxColumn(string pColumnText, DefaultPaymentList pContainer) { ColumnText = pColumnText; _container = pContainer; }
public void InstantiateIn(Control container) { //Textboxes erstellen und initalisieren TextBox tbHours = new TextBox(); TextBox tbMinutes = new TextBox(); tbHours.ID = "tbHours"; tbMinutes.ID = "tbMinutes"; tbHours.EnableViewState = true; tbHours.EnableViewState = true; tbHours.Width = 25; tbHours.MaxLength = 3; tbMinutes.Width = 17; tbMinutes.MaxLength = 2;
//Event-Methoden fürs Databinding tbHours.DataBinding += new EventHandler(tbHours_DataBinding); tbMinutes.DataBinding += new EventHandler(tbMinutes_DataBinding);
//Stunden-Textbox hinzufügen container.Controls.Add(tbHours);
//zwischen Stunden- und Minuteneingab kommt ein ":" Label l = new Label(); l.Text = " : "; container.Controls.Add(l);
//Minute-Textbox hinzufügen container.Controls.Add(tbMinutes); }
void tbMinutes_DataBinding(object sender, EventArgs e) { //Minuten-Eingabe mit Wert füllen TextBox tbInput = (TextBox)sender; GridViewRow container = (GridViewRow)tbInput.NamingContainer; tbInput.Text = DataBinder.Eval(container.DataItem, ColumnText).ToString(); if (tbInput.Text == "") tbInput.Text = "0"; tbInput.Text = Default.ConvertSecondsToString(int.Parse(tbInput.Text)); tbInput.Text = tbInput.Text.Split(new char[] { ':' })[1]; _container.AddMinuteInput(DataBinder.Eval(container.DataItem, DefaultPaymentList.ACC_DB_ACCNR).ToString(), tbInput); }
void tbHours_DataBinding(object sender, EventArgs e) { //Stunden-Eingabe mit Wert füllen TextBox tbInput = (TextBox)sender; GridViewRow container = (GridViewRow)tbInput.NamingContainer; tbInput.Text = DataBinder.Eval(container.DataItem, ColumnText).ToString(); tbInput.Style.Value = "text-align: right"; if (tbInput.Text == "") tbInput.Text = "0"; tbInput.Text = Default.ConvertSecondsToString(int.Parse(tbInput.Text)); tbInput.Text = tbInput.Text.Split(new char[] { ':' })[0]; _container.AddHourInput(DataBinder.Eval(container.DataItem, DefaultPaymentList.ACC_DB_ACCNR).ToString(), tbInput); } }
So erstelle ich die Gridview-spalten:
if (!IsPostBack) { for (int i = 0; i < _summaryList.Columns.Count; i++) { //Wenn Eingabespalte - Templatespalte erstellen if (_summaryList.Columns[i].ColumnName == ACC_WEB_PAYMENT) { TemplateField temp = new TemplateField(); temp.ItemTemplate = new GridViewTextBoxColumn(ACC_WEB_PAYMENT, this); temp.HeaderText = ACC_WEB_PAYMENT; gv.Columns.Add(temp); _editColumn = i; } else { BoundField field = new BoundField(); if (_summaryList.Columns[i].ColumnName == ACC_WEB_HOURS || _summaryList.Columns[i].ColumnName == ACC_WEB_PAYMENT || _summaryList.Columns[i].ColumnName == ACC_WEB_AFTER_BOOKING) field.ItemStyle.HorizontalAlign = HorizontalAlign.Right; field.HeaderText = _summaryList.Columns[i].ColumnName; field.DataField = _summaryList.Columns[i].ColumnName; gv.Columns.Add(field); } } }
Nochmal: Ich brauch keinen Edit-Buttons oder sonstwas, ich will nur dass ASP die eingegebenen TextBox-Werte beim reload beibehält.
Kann mir irgendjemand helfen? thia
|