SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Keine Daten nach Postback

Geprüfte Antwort Dieser Beitrag hat 6 Antworten

Ohne Rang
4 Beiträge
NicoBarzanowski erstellt 15 Jan. 2010 17:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo an alle Leser,
ein Sharepoint-Entwicklungsproblem bringt mich noch zu Wahnsinn!

Sue Hernandez hat in ihrem Blog gezeigt, wie man an ein SPGridview weitere Spalten mit diversen Webcontrols hinzufügen kann:
http://suehernandez.wordpress.com/2009/07/07/moss-spgridview-with-checkbox-column/

Den Quelltext habe ich so übernommen und es funktioniert wunderbar.
Wenn ich nun mit Hilfe eines Buttons ein ClickEvent feuere, dann ist gridView.Rows.Count == 0 und
die foreach Schleife wird nicht durchlaufen.
private void cmdSubmit_Click(object sender, EventArgs e)
  {
   foreach (GridViewRow row in gridView.Rows)
   {
    CheckBox cb = row.Cells[0].Controls[0] as CheckBox;
    this.Controls.Add(new LiteralControl("<br>" + cb.Checked.ToString() + " " + row.Cells[1].Text));
   }
  }
Wenn ich mein gridView im Debugmodus auf Watch setze dann sehe ich, dass das WebControl und alle andern WebControls in der Funktion CreateChildControls() zurückgesetzt werden.

Wie komme ich an die Daten der Controls heran, nachdem ein Postback durch den User ausgelöst wurde?

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Jan. 2010 10:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dazu braucht man einiges mehr Informationen. Wann und wie werden die Controls und insbesndere das Grid erzeugt? Wann werden die Daten gebunden?

Grundsätzlich erhält ein Control seine Daten nach einem Postback wieder, wenn es eine eindeutige ID hat (und natürlich immer die selbe).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
4 Beiträge
NicoBarzanowski Als Antwort am 18 Jan. 2010 08:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi Fandrich
vielen Dank für deine Antwort.

Der Ablauf ist folgender Maßen:

Klasse: Controls public deklarieren

CreateChildControls()
{
 Controls mit new initialisieren
 Controleigenschaften setzen
 Spalten vom Gridview erzeugen
 this.Controls.Add(gridView)
}

Render(HTMLTextWriter Writer)
{
 DB Abfragen
 ein DataTable mit Daten füllen
 gridView.DataSource = new DataView(DataTable)
 gridView.Databind()
}

Click Ereignis wie gehabt

MFG
NicoBarzanowski

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Jan. 2010 18:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Ablauf ist schonmal korrekt. Hast Du acuh meine anderen Anmwekungen beachtet? Haben die Controls eine eindeutige ID? EnableViewState=true und nichts überschreiben wenn IsPostBack=true?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
4 Beiträge
NicoBarzanowski Als Antwort am 19 Jan. 2010 15:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo!
habe den Ablauf geändert:

Klasse: Controls public deklarieren

CreateChildControls()
{
  Controls mit new initialisieren
  Controleigenschaften setzen
  
  this.Controls.Add(gridView)
  if (!Page.IsPostback)
  {
    Spalten vom Gridview erzeugen
    DB Abfragen
    ein DataTable mit Daten füllen
    gridView.DataSource = new DataView(DataTable)
    gridView.Databind()
   }
}

private void cmdSubmit_Click(object sender, EventArgs e)
  {
   foreach (GridViewRow row in gridView.Rows)
   {
    CheckBox cb = row.Cells[0].Controls[0] as CheckBox;
    this.Controls.Add(new LiteralControl("<br>" + cb.Checked.ToString() + " " + row.Cells[1].Text));    
   
    Spalten vom Gridview erzeugen
    DB Abfragen
    ein DataTable mit Daten füllen
    gridView.DataSource = new DataView(DataTable)
    gridView.Databind()
   }
  }
Die Funktion Render(HTMLTextWriter writer) nutze ich nicht mehr.
Erkenntnis: Wenn ich die Spalten in der Funktion CreateChildControls() erzeuge wenn IsPostBack=true ist, dann wird mein ViewState gekillt.

Jetzt habe ich Zugriff auf das Control (SPGridView).
Ich kann alle Spalten auslesen, bis auf die Spalte mit den Checkboxen.
CheckBox cb = row.Cells[0].Controls[0] as CheckBox --> OutOfRangeExeption weil row.Cells[0].Controls[0] == null ist.

Werde weiter an diesem Problem herumdoktorn...

Gruß
NicoBarzanowski

Ohne Rang
4 Beiträge
NicoBarzanowski Als Antwort am 26 Jan. 2010 12:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

habe eine Möglichkeit gefunden die User-Selektion der Checkboxen auszuwerten.
Mit Hilfe von OnClientClick="CollectCheckboxen()" wird eine Javascript-Funktion aufgerufen, die durch alle Checkboxen schleift und die Information, ob das Steuerelement gechecked ist, in eine Textbox schreibt. Diese Textbox hat eine Größe von 0Pixel und ist damit nicht sichtbar.
Nach einem Postback kann ich auf den Inhalt der Textbox zugreifen.

//Sue H. Javascript-Funktion von mir abgewandelt:
private LiteralControl GetJavaScript()
{
 StringBuilder sb = new StringBuilder();
  sb.Append(
"\n\n");
  sb.Append(
"<script language='javascript'>\n");
  sb.Append(
" function CollectCheckboxen() \n");
  sb.Append(
" { \n");
  sb.Append(
" var checkboxes = document.getElementsByTagName('input'); \n");
  sb.Append(
" var counter = 0;\n");
  sb.Append(
" var Label = '';\n");
  sb.Append(
" for(var i=0; i<checkboxes.length; i++) \n");
  sb.Append(
" { \n");
  sb.Append(
" // Look for a CheckBox \n");
  sb.Append(
" var checkbox = checkboxes[i]; \n");
  sb.Append(
" \n");
  sb.Append(
" // Verify it's the right name \n");
  sb.Append(
" var start = '" + MyGridView.ClientID + "'; \n");
  sb.Append(
" var end = 'CustomCheckboxID'; \n");
  sb.Append(
" var startsWith = checkbox.id.match('^'+start)==start; \n");
  sb.Append(
" var endsWith = checkbox.id.match(end+'$')==end; \n");
  sb.Append(
" \n");
  sb.Append(
" // Make the switch \n");
  sb.Append(
" if(startsWith && endsWith) \n");
  sb.Append(
" { \n");
  sb.Append(
" if(checkbox.checked){");
  sb.Append(
" Label = Label + counter + ';true~';}\n");
  sb.Append(
" else{\n");
  sb.Append(
" Label = Label + counter + ';false~';}\n");
  sb.Append(
" counter = counter + 1; \n");
  sb.Append(
" } \n");
  sb.Append(
" } \n");
  sb.Append(
" document.getElementById('" + txtErgebnCheck.ClientID + "').value = Label;\n");
  sb.Append(
" } \n");
  sb.Append(
"</script>\n");
return new LiteralControl(sb.ToString());
}

//Event Click:
public void toolbuttonSelect_Click(object sender, EventArgs e)
{
 try
 {
  String[,] CheckBoxen = new String [Paging,2];
  String[] Elemente = new String [Paging];
  Elemente = ErgebnCheck.Text.Substring(0,txtErgebnCheck.Text.Length -1).Split(
'~');
  for (int i = 0; i < Paging; i++)
  {
    CheckBoxen[i, 0] = Elemente[i].Split(
';')[0];
    CheckBoxen[i, 1] = Elemente[i].Split(
';')[1];
  }
....
....
 }
  chatch{}
}

Fehler sind noch nicht abgefangen worden.
Wenn z.B.: Die Anzahl von Zeilen im GridView < Paging dann würde die Schleife zu lang laufen.
Der Quelltext ist nur beispielhaft zu sehen.

Gruß
NicoBarzanowski

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Jan. 2010 15:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Schön, daß Du eine Lösung gefunden (und gepostet!) hast.

Ich würde aber statt der Textbox mit Breite 0 lieber ein hidden-Control nehmen. Die sind dafür da :-)

Viele Grüße
Andi
af @ evocom de
Blog