2010-11-16 28 views
1

J'ai beaucoup essayé et j'ai atteint une impasse.databind une grille de peuplement dans le code derrière

J'ai un pour montrer plusieurs gridviews sur une page et tous ceux-ci sont remplis dynamiquement.

J'ai trouvé un moyen de remplir dynamiquement le gridview et de l'afficher, mais je ne peux pas obtenir comment modifier ces valeurs et les afficher comme je le veux.

Voici le code. pour .aspx Page

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server"> 
<asp:Panel ID="Panel1" runat="server" ScrollBars ="Auto" Height="500px" BorderColor="#003399" BorderWidth="3px"> 


</asp:Panel> 
</asp:Content> 

et voici le code pour .aspx.cs

for (int j = 0; j < 5; j++) 
     { 
      GridView Grid = new GridView(); 
      ArrayList machID = new ArrayList(); 
      ArrayList machName = new ArrayList(); 


      Grid.ID = machGrps[j].ToString(); 
      Grid.AllowSorting = true; 
      Grid.CellSpacing = 2; 
      Grid.GridLines = GridLines.None; 
      Grid.Width = Unit.Percentage(100); 

      DataTable dt = new DataTable(); 
      SqlConnection connection = new SqlConnection(Session["ConnectionStringSQL"].ToString()); 
      connection.Open(); 
      SqlCommand sqlCmd = new SqlCommand("select MachineID, MachineName from Machines", connection); 
      SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd); 

      sqlDa.Fill(dt); 
      connection.Close(); 

      if (dt.Rows.Count > 0) 
      { 
       for (int i = 0; i < dt.Rows.Count; i++) 
       { 
        machID.Add(dt.Rows[i]["MachineID"].ToString()); 
        machName.Add(dt.Rows[i]["MachineName"].ToString()); 

       } 

       DataTable taskTable = new DataTable(); 
       taskTable.Columns.Add("MachineID"); 
       taskTable.Columns.Add("MachineName"); 

       if (machID.Count != 0) 
       { 
        for (int i = 0; i < machID.Count; i++) 
        { 
         DataRow tableRow = taskTable.NewRow(); 
         tableRow["MachineID"] = machID[i]; 
         tableRow["MachineName"] = machName[i]; 

         taskTable.Rows.Add(tableRow); 
        } 
       }     


       Session["TaskTable"] = taskTable; 

       Grid.DataSource = Session["TaskTable"]; 
       Grid.DataBind(); 

       Label label = new Label(); 
       label.Text = "Machine Grp" + Grid.ID; 
       Panel1.Controls.Add(label); 
       Panel1.Controls.Add(Grid); 

      } 
     } 

NOTE CE CODE CI-DESSOUS NE PEUT ÊTRE FAITE COMME JE PLUS LA GRIDVIEW POPULATE à partir des tableaux:

J'avais l'habitude de modifier comme ceci quand le ondatabound = "GridView1_DataBound" si est appelé de la page .aspx

le code de base de données ressemble à ceci:

protected void GridView1_DataBound(object sender, EventArgs e) 
    { 
     foreach (GridViewRow myRow in GridView1.Rows) 
     { 

      //this is where ID is stored in an label template 
      Label Label3 = (Label)myRow.FindControl("Label3"); 
      int val = Convert.ToInt32(Label3.Text); 

      Image Image5 = (Image)myRow.FindControl("Image5"); 
      if (Convert.ToInt32(Label3.Text) < 0) 
      { 
       Image5.ImageUrl = "~/NewFolder1/warning_16x16.gif"; 
      } 
      else 
      { 
       Image5.ImageUrl = "~/NewFolder1/1258341827_tick.png"; 
      } 
     } 

    } 

Répondre

3

Deux choses:

protected void GridView1_DataBound(object sender, EventArgs e) { 
    foreach (GridViewRow myRow in GridView1.Rows) { 
     // blah blah blah code goes here 
    } 
} 

devrait être

//now e is a 
protected void Grid_RowDataBound(object sender, GridViewRowEventArgs e) { 
    if (e.Row.RowType == DataControlRowType.DataRow) { 
     // blah blah blah, this lets you work on one row at a time. 
     // since the framework does this per row, you don't need to parse the gridview 
     // yourself, altho you're more than welcome to. 
     // But you can get more control this way. I promise. 
     Label Label3 = (Label)e.Row.FindControl("Label3"); 
     int val = Convert.ToInt32(Label3.Text); 

     Image Image5 = (Image)e.Row.FindControl("Image5"); 
     if (val < 0) 
     { 
      Image5.ImageUrl = "~/NewFolder1/warning_16x16.gif"; 
     } 
     else 
     { 
      Image5.ImageUrl = "~/NewFolder1/1258341827_tick.png"; 
     } 

     // alternately write the code above like this: 
     Image Image5 = (Image)e.Row.FindControl("Image5"); 
     Image5.ImageUrl = (val < 0) ? "~/NewFolder1/warning_16x16.gif" : "~/NewFolder1/1258341827_tick.png"; 
     // that's called the ternary operator. Takes up less space, does the same thing. 
    } 
} 

S'il vous plaît ne pas ignorer cette partie

maintenant à l'autre partie, savez-vous que vous pouvez lier encore dans l'arrière comme ainsi:

GridView1.RowDataBound += GridView1_RowDataBound; 

Mettez-le ici:

for (int j = 0; j < 5; j++) 
    { 
     GridView Grid = new GridView(); 
     ArrayList machID = new ArrayList(); 
     ArrayList machName = new ArrayList(); 

     //NEW LINE (doesn't need the comment or the blank space tho) 
     Grid.RowDataBound += Grid_RowDataBound; 

     Grid.ID = machGrps[j].ToString(); 
     Grid.AllowSorting = true; 
     Grid.CellSpacing = 2; 
     Grid.GridLines = GridLines.None; 
     Grid.Width = Unit.Percentage(100); 
+0

e.Row.RowType == DataControlRowType.DataRow comme vous le dire prendra la ligne entière, mais comment puis-je modifier la valeur de cette ligne. Comme vous pouvez le voir, je l'ai peuplé dynamiquement. Je veux dire d'abord j'avais l'étiquette à rechercher car elle contenait l'ID mais maintenant je n'ai pas d'étiquette pour trouver – user175084

+0

drachenstern .. c'est ce que je dis qu'il n'y a pas de contrôle Label 3 car je n'ai pas créé le gridview dans la page HTML donc quand il essaie de le faire "Label Label3 = (Label) e.Row.FindControl (" Label3 ");" il n'obtiendra rien. – user175084

+1

@ user175084 ~ Ah, je pense que je vois le problème. Savez-vous quelle cellule vous voulez de la table?(vous pouvez le trouver avec Firebug, par exemple) alors vous pourriez faire 'e.Row.Cells [0] .Text' au lieu de' Label3.Text'. Je viens de me rendre compte que vous cherchez une étiquette que vous n'avez jamais explicitement assignée. Vous pouvez également utiliser le 'DataItem' de' Row' de 'e.Row.DataItem' si vous voulez utiliser la valeur de votre datatable à la place. – jcolebrand

1

Est-ce que ça explose lorsque vous liez la DataSource à l'objet Session?

Grid.DataSource = taskTable; 
+0

le code ci-dessus fonctionne bien ... mais comment puis-je modifier le gridview je reçois .... J'ai donné l'exemple ci-dessus – user175084

2

Faites vos modifications dynamiques sur GridView1_RowDataBound pas GridView1_DataBound

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     Label Label3 = (Label)e.Row.FindControl("Label3"); 
     .... 
    } 
} 
+0

vos doigts étaient plus rapides, ou alors il semble, mais je pense qu'il ne connaît pas une partie de la syntaxe, voir la dernière rangée de mon message. .. – jcolebrand

+1

lol, je suppose que vous êtes plus rapide que vous avez tapé plus de lignes que moi :) – Raymund

+0

Bonjour, puis-je savoir où vous g et ton avatar? Je recherche des sites qui offrent des services comme celui-là. Où avez-vous eu le vôtre? – yonan2236