Problème de placeholder dans un repeater

Problème de placeholder dans un repeater - C#/.NET managed - Programmation

Marsh Posté le 16-10-2007 à 23:56:28    

Bonjour,
Je m'arrache les cheveux sur un probleme .net, aspx, c# et je ne vois plus d'autre solution que de vous poser la question en esperant que l'un de vous puisse allumer ma lanterne (je n'en doute en fait pas) :  
 
J'ai un placeholder dans un repeater et voudrais dans ce placeholder faire un upload de fichier multiple. Je voudrais donc que cet upload multiple puisse charger les noms des differents fichiers dans une list pour finalement offrire la possibilité d'uploader tout d'un coup.
 
J'ai tenté de sortir le code qui pose problème de son context pour vous illustrer la situation simplement.  
voici le code qui marche (test1) et celui qui ne marche pas (test2) j'aimerai comprendre pourquoi l'un marche et pas l'autre ??
 
fichier aspx de base :

Code :
  1. <%@ Control Language="C#" AutoEventWireup="true" CodeFile="TMP2.ascx.cs" Inherits="pageControls_campaignReporting_WebUserControl" %>
  2. <%@ Reference Control="~/ctrlMultipleUpload.ascx" %>
  3. test 1
  4.   <asp:PlaceHolder runat="server" ID="holderMultipleUpload1"></asp:PlaceHolder>
  5.  
  6. test 2
  7. <asp:repeater id="rptFormItems" OnItemDataBound="rptFormItems_ItemDataBound" Runat="server">
  8.     <ItemTemplate>      
  9.         <asp:PlaceHolder runat="server" ID="holderMultipleUpload"></asp:PlaceHolder>
  10.     </ItemTemplate>      
  11. </asp:repeater>


 
fichier c# associé :

Code :
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11. public partial class pageControls_campaignReporting_WebUserControl : System.Web.UI.UserControl
  12. {
  13.     private controls_formGenerator_ctrlMultipleUpload ctrlMultipleUpload;
  14.     private controls_formGenerator_ctrlMultipleUpload ctrlMultipleUpload1;
  15.     private void Page_Load(object sender, System.EventArgs e)
  16.     {
  17.         ctrlMultipleUpload1 = (controls_formGenerator_ctrlMultipleUpload)LoadControl("~/ctrlMultipleUpload.ascx" );
  18.         if (ctrlMultipleUpload1 != null)
  19.         {
  20.             ctrlMultipleUpload1.inputStyle = "";
  21.             ctrlMultipleUpload1.inputBaseName = "";
  22.             holderMultipleUpload1.Controls.Add(ctrlMultipleUpload1);
  23.         }
  24.         DataTable dt = new DataTable();
  25.         dt.Columns.Add("test" );
  26.         dt.Rows.Add("3" );
  27.         rptFormItems.DataSource = dt;
  28.         rptFormItems.DataBind();
  29.     }
  30.     public void rptFormItems_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
  31.     {
  32.         ctrlMultipleUpload = (controls_formGenerator_ctrlMultipleUpload)LoadControl("~/ctrlMultipleUpload.ascx" );
  33.         if (ctrlMultipleUpload != null)
  34.         {
  35.             ((PlaceHolder)e.Item.FindControl("holderMultipleUpload" )).Controls.Add(ctrlMultipleUpload);
  36.         }
  37.        
  38.     }
  39. }


 
controle ctrlMultipleUpload :
aspx

Code :
  1. <%@ Control Language="C#" AutoEventWireup="false" CodeFile="ctrlMultipleUpload.ascx.cs" Inherits="controls_formGenerator_ctrlMultipleUpload" %>
  2.    
  3.     <input id="FindFile" style="WIDTH: 274px; HEIGHT: 22px"
  4.               type="file" size="26" runat="server" name="FindFile" />
  5.     <br />
  6.     <asp:listbox id="ListBox1" EnableViewState="true"
  7.                runat="server" CssClass="txtbox"
  8.               Height="100px" Width="274px" Font-Size="XX-Small"></asp:listbox>
  9.     <br />
  10.     <asp:button id="AddFile" runat="server" Height="23px"
  11.               Width="72px" Text="Add">
  12.     </asp:button>
  13.     <asp:button id="RemvFile"
  14.               runat="server" OnClick="RemvFile_Click"
  15.               Height="23px" Width="72px" Text="Remove">
  16.     </asp:button>
  17.     <input id="Upload" style="WIDTH: 71px; HEIGHT: 24px"
  18.               type="submit" value="Upload" runat="server"
  19.               onserverclick="Upload_ServerClick" name="Upload" />
  20.     <br />
  21.     <asp:label id="Label1" runat="server" Height="25px" Width="249px"></asp:label>


 
c#

Code :
  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Web;
  7. using System.Web.SessionState;
  8. using System.Web.UI;
  9. using System.Web.UI.WebControls;
  10. using System.Web.UI.HtmlControls;
  11. using System.Xml;
  12. public partial class controls_formGenerator_ctrlMultipleUpload : System.Web.UI.UserControl
  13. {
  14.    /* protected System.Web.UI.WebControls.ListBox ListBox1;
  15.     protected System.Web.UI.WebControls.Button AddFile;
  16.     protected System.Web.UI.WebControls.Button RemvFile;
  17.     protected System.Web.UI.HtmlControls.HtmlInputFile FindFile;
  18.     protected System.Web.UI.HtmlControls.HtmlInputButton Upload;
  19.     protected System.Web.UI.WebControls.Label Label1;
  20.     protected System.Web.UI.HtmlControls.HtmlGenericControl txtOutput;*/
  21.     public ArrayList files = new ArrayList();
  22.     static public ArrayList hif = new ArrayList();
  23.     public int filesUploaded = 0;
  24.    
  25.     public String inputStyle = "";
  26.     public String inputBaseName = "";
  27.     private void Page_Load(object sender, System.EventArgs e)
  28.     {
  29.         FindFile.Attributes.CssStyle.Value = inputStyle;
  30.         AddFile.Attributes.CssStyle.Value = inputStyle;
  31.         Upload.Attributes.CssStyle.Value = inputStyle;
  32.         RemvFile.Attributes.CssStyle.Value = inputStyle;
  33.     }
  34.     #region Web Form Designer generated code
  35.     override protected void OnInit(EventArgs e)
  36.     {
  37.         //
  38.         // CODEGEN: This call is required by the ASP.NET Web Form Designer.
  39.         //
  40.         InitializeComponent();
  41.         base.OnInit(e);
  42.     }
  43.  
  44.     private void InitializeComponent()
  45.     {   
  46.         this.RemvFile.Click += new System.EventHandler(this.RemvFile_Click);
  47.         this.AddFile.Click += new System.EventHandler(this.AddFile_Click);
  48.         this.Upload.ServerClick += new System.EventHandler(this.Upload_ServerClick);
  49.         this.Load += new System.EventHandler(this.Page_Load);
  50.     }
  51.     #endregion
  52.     protected void AddFile_Click(object sender, System.EventArgs e)
  53.     {
  54.         if (this.IsPostBack == true)
  55.         {
  56.             hif.Add(FindFile);
  57.             ListBox1.Items.Add(FindFile.PostedFile.FileName);
  58.         }
  59.         else
  60.         {
  61.            
  62.         }
  63.     }
  64.     protected void RemvFile_Click(object sender, System.EventArgs e)
  65.     {
  66.         if(ListBox1.Items.Count != 0)
  67.         {
  68.             hif.RemoveAt(ListBox1.SelectedIndex);
  69.             ListBox1.Items.Remove(ListBox1.SelectedItem.Text);
  70.         }   
  71.     }
  72.     protected void Upload_ServerClick(object sender, System.EventArgs e)
  73.     {
  74.         string baseLocation = "C:\\temp\\";
  75.         string status = "";
  76.        
  77.        
  78.         if((ListBox1.Items.Count == 0) && (filesUploaded == 0))
  79.         {
  80.             Label1.Text = "Error - a file name must be specified.";
  81.             return;
  82.         }
  83.         else
  84.         {
  85.             foreach(System.Web.UI.HtmlControls.HtmlInputFile HIF in hif)
  86.             {
  87.                 try
  88.                 {
  89.                     string fn = System.IO.Path.GetFileName(HIF.PostedFile.FileName);
  90.                     HIF.PostedFile.SaveAs(baseLocation + fn);
  91.                     filesUploaded++;
  92.                     status += fn + "<br>";
  93.                 }
  94.                 catch(Exception err)
  95.                 {
  96.                     Label1.Text = "Error saving file " + baseLocation
  97.                                                        + "<br>" + err.ToString();
  98.                 }
  99.             }
  100.             if(filesUploaded == hif.Count)
  101.             {
  102.                 Label1.Text = "These " + filesUploaded + " file(s) were "
  103.                                        + "uploaded:<br>" + status;
  104.             }
  105.             hif.Clear();
  106.             ListBox1.Items.Clear();
  107.         }
  108.     }   
  109. }


 
J'éspere que ma question est correctement posée :)
Un énorme merci d'avance à tous ceux qui me donneront des pistes...


Message édité par peak le 16-10-2007 à 23:58:02
Reply

Marsh Posté le 16-10-2007 à 23:56:28   

Reply

Marsh Posté le 17-10-2007 à 09:30:34    

Salut :)
 
Désolé, tête dans le paté ce matin powa, donc j'ai pas compris ta question, donc pardonne-moi d'avance si je répond à côté de la plaque :D
 
De ce que je lis dans ma boule de crystal embrumée, quand tu mets un contrôle directement dans ton repeater dans le fichier ASPX, tu ne sais pas trop comment y accéder, c'est ça ?
 
Si oui, alors moi j'avais trouvé à en .NET 1.1, pas eu à me poser la question en 2.0, y'a peut-être plus propre :

Code :
  1. private void bouSearchPro_ItemDataBound(object sender, RepeaterItemEventArgs e)
  2.         {
  3.             if (e.Item.ItemType == ListItemType.Footer)
  4.             {
  5.                 ((Literal)e.Item.FindControl("titLegend" )).Text = lan.GetMessage((string)Session["codlan"], "titLegend" );
  6.                 ((Literal)e.Item.FindControl("txtLegend" )).Text = lan.GetMessage((string)Session["codlan"], "txtLegend" );
  7.             }
  8.             else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  9.             {
  10.                 if ((string)((DataRowView)e.Item.DataItem)["sigfou"] != this.currentSigfou)
  11.                 {
  12.                     this.currentSigfou = (string)((DataRowView)e.Item.DataItem)["sigfou"];
  13.                     Label lblSigfou = new Label();
  14.                     lblSigfou.Text = this.currentSigfou;
  15.                     lblSigfou.Attributes.Add("style", "clear: both; font-weight: bold; display: block;" );
  16.                     e.Item.Controls.AddAt(0, lblSigfou);
  17.                 }
  18.                 if ((string)((DataRowView)e.Item.DataItem)["codblocage"] == "DEP" )
  19.                 {
  20.                     ((Label)e.Item.FindControl("titRefpro" )).ForeColor = System.Drawing.Color.Blue;
  21.                     ((Label)e.Item.FindControl("titSize" )).ForeColor = System.Drawing.Color.Blue;
  22.                     ((Label)e.Item.FindControl("titPrxtar" )).ForeColor = System.Drawing.Color.Blue;
  23.                     ((Label)e.Item.FindControl("titQotite" )).ForeColor = System.Drawing.Color.Blue;
  24.                     ((Label)e.Item.FindControl("refpro" )).ForeColor = System.Drawing.Color.Blue;
  25.                     ((Label)e.Item.FindControl("valSize" )).ForeColor = System.Drawing.Color.Blue;
  26.                     ((Label)e.Item.FindControl("titStatut" )).ForeColor = System.Drawing.Color.Blue;
  27.                     ((Label)e.Item.FindControl("valStatut" )).ForeColor = System.Drawing.Color.Blue;
  28.                     ((Label)e.Item.FindControl("nompro" )).ForeColor = System.Drawing.Color.Blue;
  29.                     ((Label)e.Item.FindControl("prxtar" )).ForeColor = System.Drawing.Color.Blue;
  30.                     ((Label)e.Item.FindControl("qotite" )).ForeColor = System.Drawing.Color.Blue;
  31.                 }
  32.                 else if ((string)((DataRowView)e.Item.DataItem)["codblocage"] == "PMT" || (string)((DataRowView)e.Item.DataItem)["codblocage"] == "SOL" )
  33.                 {
  34.                     ((Label)e.Item.FindControl("titRefpro" )).ForeColor = System.Drawing.Color.Green;
  35.                     ((Label)e.Item.FindControl("titSize" )).ForeColor = System.Drawing.Color.Green;
  36.                     ((Label)e.Item.FindControl("titPrxtar" )).ForeColor = System.Drawing.Color.Green;
  37.                     ((Label)e.Item.FindControl("titQotite" )).ForeColor = System.Drawing.Color.Green;
  38.                     ((Label)e.Item.FindControl("refpro" )).ForeColor = System.Drawing.Color.Green;
  39.                     ((Label)e.Item.FindControl("valSize" )).ForeColor = System.Drawing.Color.Green;
  40.                     ((Label)e.Item.FindControl("titStatut" )).ForeColor = System.Drawing.Color.Green;
  41.                     ((Label)e.Item.FindControl("valStatut" )).ForeColor = System.Drawing.Color.Green;
  42.                     ((Label)e.Item.FindControl("nompro" )).ForeColor = System.Drawing.Color.Green;
  43.                     ((Label)e.Item.FindControl("prxtar" )).ForeColor = System.Drawing.Color.Green;
  44.                     ((Label)e.Item.FindControl("qotite" )).ForeColor = System.Drawing.Color.Green;
  45.                 }
  46.                 ((Label)e.Item.FindControl("titRefpro" )).Text = lan.GetMessage((string)Session["codlan"], "titRefpro" );
  47.                 ((Label)e.Item.FindControl("titSize" )).Text = lan.GetMessage((string)Session["codlan"], "titSize" );
  48.                 //if (habilitation.getHabilitation((string)Session["habilitation"], habilitation.Habilitations.vtar))
  49.                 //{
  50.                     ((Label)e.Item.FindControl("titPrxtar" )).Text = lan.GetMessage((string)Session["codlan"], "titPrxtar" );
  51.                 //}
  52.                 ((Label)e.Item.FindControl("titQotite" )).Text = lan.GetMessage((string)Session["codlan"], "titQotite" );
  53.                 ((Label)e.Item.FindControl("refpro" )).Text = (string)((DataRowView)e.Item.DataItem)["refpro"];
  54.                 if (habilitation.getHabilitation((string)Session["habilitation"], habilitation.Habilitations.readNews) && (decimal)((DataRowView)e.Item.DataItem)["numnew"] != 0)
  55.                 {
  56.                     HtmlAnchor newLinkBtn = new HtmlAnchor();
  57.                     newLinkBtn.InnerText = "*";
  58.                     newLinkBtn.HRef = "News.aspx?numnew=" + ((decimal)((DataRowView)e.Item.DataItem)["numnew"]).ToString();
  59.                     ((Label) e.Item.FindControl("refpro" )).Controls.Add(newLinkBtn);
  60.                 }
  61.                 ((Label)e.Item.FindControl("valSize" )).Text = string.Format(lan.GetMessage((string)Session["codlan"], "valSize" ), ((decimal)((DataRowView)e.Item.DataItem)["longue"]).ToString(), ((decimal)((DataRowView)e.Item.DataItem)["large"]).ToString(), ((decimal)((DataRowView)e.Item.DataItem)["haute"]).ToString());
  62.                 ((Label)e.Item.FindControl("titStatut" )).Text = lan.GetMessage((string)Session["codlan"], "titStatut" );
  63.                 ((Label)e.Item.FindControl("valStatut" )).Text = (string)((DataRowView)e.Item.DataItem)["codblocage"];
  64.                 if ((decimal)((DataRowView)e.Item.DataItem)["longue"] == 0 && (decimal)((DataRowView)e.Item.DataItem)["large"] == 0 && (decimal)((DataRowView)e.Item.DataItem)["haute"] == 0)
  65.                 {
  66.                     ((Label)e.Item.FindControl("titSize" )).Visible = false;
  67.                     ((Label)e.Item.FindControl("valSize" )).Visible = false;
  68.                 }
  69.                 ((Label)e.Item.FindControl("nompro" )).Text = (((string)((DataRowView)e.Item.DataItem)["design1"]).Trim().Length == 0)?(string)((DataRowView)e.Item.DataItem)["nompro"]:(string)((DataRowView)e.Item.DataItem)["design1"] + (string)((DataRowView)e.Item.DataItem)["design2"] + (string)((DataRowView)e.Item.DataItem)["design3"];
  70.                 //if (habilitation.getHabilitation((string)Session["habilitation"], habilitation.Habilitations.vtar))
  71.                 //{
  72.                     ((Label)e.Item.FindControl("prxtar" )).Text = (string)((DataRowView)e.Item.DataItem)["prxtar"] + " " + ToolBox.CoddevToSymbol((string)((DataRowView)e.Item.DataItem)["coddev"]);
  73.                     ((Literal)e.Item.FindControl("txtQtecde" )).Text = "<input type=\"text\" name=\"qte" + ((string)((DataRowView)e.Item.DataItem)["codpro"]) + "\" value=\"1\" maxlength=\"4\" size=\"1\">";
  74.                     ((Literal)e.Item.FindControl("txtQtecde" )).Text += "<input type=\"hidden\" name=\"qot" + ((string)((DataRowView)e.Item.DataItem)["codpro"]) + "\" value=\"" + ((decimal)((DataRowView)e.Item.DataItem)["qotite"]).ToString() + "\">";
  75.                     ((LinkButton)e.Item.FindControl("btnChgPro" )).Text = lan.GetMessage((string)Session["codlan"], "addBasket" );
  76.                     ((LinkButton)e.Item.FindControl("btnChgPro" )).CommandArgument = (string)((DataRowView)e.Item.DataItem)["codpro"];
  77.                 //}
  78.                 //else
  79.                 //{
  80.                 //    ((LinkButton)e.Item.FindControl("btnChgPro" )).Visible = false;
  81.                 //}
  82.                 ((Label)e.Item.FindControl("qotite" )).Text = ((decimal)((DataRowView)e.Item.DataItem)["qotite"]).ToString();
  83.                 ((Image)e.Item.FindControl("thb" )).Attributes.Add("alt", (string)((DataRowView)e.Item.DataItem)["nompro"]);
  84.                 if (((string)((DataRowView)e.Item.DataItem)["chemin_acces"]).Trim() != string.Empty)
  85.                 {
  86.                     ((Image)e.Item.FindControl("thb" )).Attributes.Add("onclick", "javascript:window.open(\"Picture.aspx?chemin_acces=" + ((string)((DataRowView)e.Item.DataItem)["chemin_acces"]).Trim().Replace("\\", "\\\\" ) + "\", \"Picture\" )" );
  87.                 }
  88.                 ((Image)e.Item.FindControl("thb" )).ImageUrl = "showThb.aspx?chemin_acces=" + ((string)((DataRowView)e.Item.DataItem)["chemin_acces"]).Trim();
  89.             }
  90.         }


 
(pour résumer, je porcine à grands coups de Findcontrol)

Reply

Marsh Posté le 17-10-2007 à 10:21:45    

Merci pour ta répopnse MagicBuzz mais ma question simplifiée est la suivante :  
 
Ici je rajoute un élément (path du fichier) dans ma liste box à chaque clique du bouton "add" et cela marche bien quand je met simplement un place holder par contre si je mets ce même place holder dans un repeater ma liste est réinitialisé à chaque post back et ma liste ne contient donc jamais que un seul élément maximum.
 
Donc pourquoi dans le cas d'un placeholder dans un repeater mes variable sont réinitialisés? (ici ma listBox)

Reply

Marsh Posté le 17-10-2007 à 10:56:18    

ah. ben là j'en sais vraiment rien :D
 
le postback a toujours été un grand mystère pour moi, qui me gonfle au plus haut point :D

Reply

Marsh Posté le 17-10-2007 à 15:34:55    

Merci quand même. Moi aussi j'ai un peu de mal avec les post back mais ça commence à rentrer tout doucement.
Je post une solution dès que j'en trouve une ....

Reply

Marsh Posté le 17-10-2007 à 21:04:17    

tu ne saurais mettre plusieurs composant d'upload pour uploader en même temps pour uen raison technique évidente.  
La limititation ne vient pas de .NET, mais directement de html. En effet, dans une trame html, il n'y a qu'une zone qui permet d'insérer un fichier, une et une seule.  
 
Ensuite, ce n'est vraiment pas bien de boucler sur les contentPlaceHolder, car tu risques d'avoir des ID identiques alors que cela est interdit. Pour preuve, tu as des comportements bizzare puisqu'au niveau du ViewState ,il n'en retient qu'un.  
 
Donc, ton problème n'est pas technique, mais vient d'une compréhension de base du protocole.

Reply

Marsh Posté le 19-10-2007 à 14:29:07    

Je ne veux pas uploader plusieurs fichiers en même temps, je veux juste comprend pourquoi le contenu d'une liste n'est plus disponible dans le cas 2, alors qu'il l'est dans le cas 1. Pour les id, .net renomme les id se trouvant dans des contrôles ou dans des repeaters avec l'instance de répétition; cela ne posera donc pas de problèmes! (...$...1234$..$id)
 

Reply

Marsh Posté le 19-10-2007 à 19:57:42    

oui mais les contentplaceholder sont pas conçu pour faire ce que tu veux faire désolé

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed