[ASP.NET / C#]Meerdere Dynamische HtmlInputFile's uitlezen

Pagina: 1
Acties:

  • Razr
  • Registratie: September 2005
  • Niet online
Ik wil dus een gebruiker bestanden laten uploaden, de gebruiker kan een aantal velden kiezen tussen de 1 en de 10. Die velden worden dus dynamisch als controls aan een DIV gekoppeld, zie de volgende code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void AantalVeldenBepalen(int OpgegevenWaarde)
    {
        for (int i = 0; i < OpgegevenWaarde; i++)
        {
            HtmlInputFile UploadVeld = new HtmlInputFile();
            UploadVeld.ID = "UploadVeld" + i;
            UploadVeld.Name = "UploadVeld" + i;

            //Aantal velden in hidden field zetten (die al bestaat)
            AantalVelden.Value = OpgegevenWaarde.ToString();            

            //Velden aan de div toevoegen
            UploadVelden.Controls.Add(UploadVeld);
            
        }
    }


Waar OpgegevenWaarde dus het aantal te maken controls is, en UploadVelden is de ID van de DIV waar de controls aan toegevoegd worden.

Onder deze velden zit een asp:button die het zaakje submit. Deze heeft een onclick event die het volgende doet:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public void ControleerBestanden(object sender, EventArgs e)
    {
        //Kijken hoeveel bestanden er zijn geupload
        int aantalB;
        int.TryParse(AantalVelden.Value, out aantalB);

        //Elke bestand apart checken en uitlezen
        for (int i = 0; i < aantalB; i++)
        {
            //Hieronder de gegevens van het geuploadde bestand uitlezen
            HtmlInputFile FotoVeld = UploadVelden.FindControl("UploadVeld") as HtmlInputFile;

            //Bestandsnaam weergeven als test dat het werkt
            Response.Write(FotoVeld.PostedFile.FileName);                                
        }

    }


Eigenlijk ook wel logisch dat dit niet werkt, ik gebruik immers nergens de ID's van de dynamische controls.
Maar beter als ik dit kan ik het niet krijgen en ben al een middag aan het zoeken. Hoe krijg ik die controls uitgelezen?

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
en als je
C#:
1
2
//Hieronder de gegevens van het geuploadde bestand uitlezen
HtmlInputFile FotoVeld = UploadVelden.FindControl("UploadVeld" + aantalB.ToString()) as HtmlInputFile;


doet?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Razr
  • Registratie: September 2005
  • Niet online
Nope, FotoVeld blijft een waarde van null houden.

Maar is toch eigenlijk ook wel logisch? In het gedeelte

C#:
1
UploadVelden.Controls.Add(UploadVeld);


Gaf ik ook geen waarde mee, dus waarom zou ik die wel met een 1,2,3 etc moeten ophalen? Of had ik juist wel een waarde mee moeten geven?

[ Voor 72% gewijzigd door Razr op 18-01-2007 16:52 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:04

TeeDee

CQB 241

Zo logisch is het niet.
Je InputFile genaamd UploadVeld heeft een Id van UploadVeld + i (dus: UploadVeld1).

Die zou je uit moeten kunnen lezen. Kan je de value wel uitlezen door het even als Request.form["UploadVeld"+i] te doen?

Je zal in je void ControleerBestanden wederom je hele control collection (UploadVelden.Controls) moeten doorlopen om het gewenste effect te bereiken.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Razr
  • Registratie: September 2005
  • Niet online
TeeDee schreef op donderdag 18 januari 2007 @ 16:58:
Zo logisch is het niet.
Je InputFile genaamd UploadVeld heeft een Id van UploadVeld + i (dus: UploadVeld1).

Die zou je uit moeten kunnen lezen. Kan je de value wel uitlezen door het even als Request.form["UploadVeld"+i] te doen?

Je zal in je void ControleerBestanden wederom je hele control collection (UploadVelden.Controls) moeten doorlopen om het gewenste effect te bereiken.
Request.Form["UploadVeld" + i] retourneert een null, leeg dus ?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:04

TeeDee

CQB 241

Wat staat er in je Client-side code bij een UploadVeld als id/name?

Maar een manier is je Controls collection door te lopen en dan de values uit te lezen.

[ Voor 3% gewijzigd door TeeDee op 18-01-2007 17:15 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Razr
  • Registratie: September 2005
  • Niet online
TeeDee schreef op donderdag 18 januari 2007 @ 17:15:
Wat staat er in je Client-side code bij een UploadVeld als id/name?

Maar een manier is je Controls collection door te lopen en dan de values uit te lezen.
Client-side staat er:

HTML:
1
<input name="ctl00$bodyContentHolder$FotoUploadControl1$UploadVeld0" type="file" id="ctl00_bodyContentHolder_FotoUploadControl1_UploadVeld0" />


Dat is goed lijkt mij? Name en ID hebben beide de waarde UploadVeld0

En hoe kan ik mijn controls collection het beste doorlopen ? (kreeg geen bruikbare resultaten met de search?)

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

En als je een button op je form plaatst met een postback en je voert die uit, bestaan de HtmlFileInputs nog steeds?

* gorgi_19 gokt dat Razr z'n controlcollection overhoop gooit :)

Anders gezegd: waar wordt AantalVeldenBepalen aangeroepen? Post die code eens :)

[ Voor 17% gewijzigd door gorgi_19 op 18-01-2007 17:59 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Razr
  • Registratie: September 2005
  • Niet online
gorgi_19 schreef op donderdag 18 januari 2007 @ 17:59:
En als je een button op je form plaatst met een postback en je voert die uit, bestaan de HtmlFileInputs nog steeds?

* gorgi_19 gokt dat Razr z'n controlcollection overhoop gooit :)

Anders gezegd: waar wordt AantalVeldenBepalen aangeroepen? Post die code eens :)
Oke ik ga het proberen..

Ik werk met views, er zijn drie views. In de eerste view kan de gebruiker het aantal velden bepalen. Dat word gesubmitted met deze button:
HTML:
1
<html:Button ID="BevestigStap1" runat="server" OnClick="VolgendeStap" Text="Volgende" />


Deze zorgt voor de volgende view dmv:
C#:
1
2
3
4
    public void VolgendeStap(object sender, EventArgs e)
    {
        FotoUploadProces.ActiveViewIndex++;
    }


Met behulp van een Switch statement word er aan de hand van het ActiveViewIndex nummer bepaalde code uitgevoerd. In dit geval:

C#:
1
2
3
4
int aantal;
int.TryParse(AantalUploadVelden.Text, out aantal);

AantalVeldenBepalen(aantal);

Waar dus onderaan de AantalVeldenBepalen() wordt aangeroepen. Al met al best ranzig zie ik nu zelf :D

Ik kan net zo goed de AantalVeldenBepalen() aanroepen bij het OnClick event van de button op de view zelf. Ik ga het proberen. Dat is niet zo simpel als ik dacht, er moet wel aangeven worden dat er naar het volgende view moet worden gegaan. En in die view staat de DIV waar de controls inkomen.

Mwah toch geprobeerd, er veranderd niets. Blijft een null returnen..

[ Voor 8% gewijzigd door Razr op 18-01-2007 18:20 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:04

TeeDee

CQB 241

Razr schreef op donderdag 18 januari 2007 @ 17:57:
[...]


Client-side staat er:

HTML:
1
<input name="ctl00$bodyContentHolder$FotoUploadControl1$UploadVeld0" type="file" id="ctl00_bodyContentHolder_FotoUploadControl1_UploadVeld0" />


Dat is goed lijkt mij? Name en ID hebben beide de waarde UploadVeld0

En hoe kan ik mijn controls collection het beste doorlopen ? (kreeg geen bruikbare resultaten met de search?)
C#:
1
2
3
4
foreach (Control c in UploadVelden.Controls)
{
//...
}

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Razr schreef op donderdag 18 januari 2007 @ 18:12:
[...]


Oke ik ga het proberen..

Ik werk met views, er zijn drie views. In de eerste view kan de gebruiker het aantal velden bepalen. Dat word gesubmitted met deze button:
HTML:
1
<html:Button ID="BevestigStap1" runat="server" OnClick="VolgendeStap" Text="Volgende" />


Deze zorgt voor de volgende view dmv:
C#:
1
2
3
4
    public void VolgendeStap(object sender, EventArgs e)
    {
        FotoUploadProces.ActiveViewIndex++;
    }


Met behulp van een Switch statement word er aan de hand van het ActiveViewIndex nummer bepaalde code uitgevoerd. In dit geval:

C#:
1
2
3
4
int aantal;
int.TryParse(AantalUploadVelden.Text, out aantal);

AantalVeldenBepalen(aantal);

Waar dus onderaan de AantalVeldenBepalen() wordt aangeroepen. Al met al best ranzig zie ik nu zelf :D

Ik kan net zo goed de AantalVeldenBepalen() aanroepen bij het OnClick event van de button op de view zelf. Ik ga het proberen. Dat is niet zo simpel als ik dacht, er moet wel aangeven worden dat er naar het volgende view moet worden gegaan. En in die view staat de DIV waar de controls inkomen.

Mwah toch geprobeerd, er veranderd niets. Blijft een null returnen..
Ze bestaan op dat moment niet. Als je dynamisch controls toevoegd, dan moet je IEDERE REQUEST ZELF deze controls toevoegen op EXACT DEZELFDE PLAATS in de controlcollection. Doe je dat niet, dan verdwijnen of je controls, of je viewstate snapt het niet meer of je postback-handlers zijn niet meer aan elkaar gekoppeld.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Razr
  • Registratie: September 2005
  • Niet online
TeeDee schreef op donderdag 18 januari 2007 @ 18:36:
[...]

C#:
1
2
3
4
foreach (Control c in UploadVelden.Controls)
{
//...
}
C#:
1
2
3
4
        foreach (Control c in UploadVelden.Controls)
        {
            Response.Write(c.UniqueID);
        }

Geeft: ctl00$bodyContentHolder$FotoUploadControl1$ctl00 Het maakt niet uit of ik 3 velden laat aanmaken of maar 1. Het resultaat is altijd hetzelfde.

Maar doe ik bijv.
C#:
1
2
3
4
        foreach (Control c in UploadVelden.Controls)
        {
            Response.Write(c.ID);
        }

Dan krijg ik niets terug.

  • Razr
  • Registratie: September 2005
  • Niet online
gorgi_19 schreef op donderdag 18 januari 2007 @ 18:47:
[...]

Ze bestaan op dat moment niet. Als je dynamisch controls toevoegd, dan moet je IEDERE REQUEST ZELF deze controls toevoegen op EXACT DEZELFDE PLAATS in de controlcollection. Doe je dat niet, dan verdwijnen of je controls, of je viewstate snapt het niet meer of je postback-handlers zijn niet meer aan elkaar gekoppeld.
Oke dit kan ik volgen denk ik :+ Maar ik kan wel een duwtje in de juiste richting gebruiken. Als ik nou na elke request dit opnieuw aanroep?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void AantalVeldenBepalen(int OpgegevenWaarde)
    {
        for (int i = 0; i < OpgegevenWaarde; i++)
        {
            HtmlInputFile UploadVeld = new HtmlInputFile();
            UploadVeld.ID = "UploadVeld" + i;
            UploadVeld.Name = "UploadVeld" + i;

            //Aantal velden in hidden field zetten (die al bestaat)
            AantalVelden.Value = OpgegevenWaarde.ToString();            

            //Velden aan de div toevoegen
            UploadVelden.Controls.Add(UploadVeld);
            
        }
    }


Maar nu worden er nieuwe controls gemaakt toch? Als in: de oude worden overschreven. Maar hoe geef ik die nieuwe de waarde van de oude mee?

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Niet :P Daar heb je de viewstate voor (voor de waarden :P)
Je voegt alleen de controls toe :) Er bestaan geen oude; een control 'leeft' niet langer dan 1 request :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Razr
  • Registratie: September 2005
  • Niet online
gorgi_19 schreef op donderdag 18 januari 2007 @ 19:05:
Niet :P Daar heb je de viewstate voor (voor de waarden :P)
Je voegt alleen de controls toe :) Er bestaan geen oude; een control 'leeft' niet langer dan 1 request :)
Maar ik heb toch ook niet langer dan 1 request nodig ?

1. Een gebruiker klikt dat hij 10 upload velden wilt

2. Een pagina komt met 10 velden, de gebruiker vult in welke bestanden hij wilt versturen en klikt op de knop Submit

3. De bestanden worden verstuurd, en/of de pagina leest de waarden uit van de velden en doet iets mee.

van view 2 naar 3 is toch maar 1 request, daarna mogen ze van mij 'doodgaan' ;)

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Razr schreef op donderdag 18 januari 2007 @ 19:13:
[...]

Maar ik heb toch ook niet langer dan 1 request nodig ?

1. Een gebruiker klikt dat hij 10 upload velden wilt

2. Een pagina komt met 10 velden, de gebruiker vult in welke bestanden hij wilt versturen en klikt op de knop Submit

3. De bestanden worden verstuurd, en/of de pagina leest de waarden uit van de velden en doet iets mee.

van view 2 naar 3 is toch maar 1 request, daarna mogen ze van mij 'doodgaan' ;)
Van 1 naar 2 is ook al een extra request :) Je veroorzaakt een postback :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Razr
  • Registratie: September 2005
  • Niet online
gorgi_19 schreef op donderdag 18 januari 2007 @ 21:48:
[...]

Van 1 naar 2 is ook al een extra request :) Je veroorzaakt een postback :)
Hoe kan ik dan de waarde uitlezen na een postback? Ik maak de controls opnieuw aan, en dan ? Hoe kom ik aan die waarden? Dus aan de file die de user heeft gesubmitted?

(sorry voor het leraar gevoel wat ik je geef, maar ik ben nog niet lang met asp.net bezig :> )

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Razr schreef op donderdag 18 januari 2007 @ 21:52:
[...]

Hoe kan ik dan de waarde uitlezen na een postback? Ik maak de controls opnieuw aan, en dan ? Hoe kom ik aan die waarden? Dus aan de file die de user heeft gesubmitted?

(sorry voor het leraar gevoel wat ik je geef, maar ik ben nog niet lang met asp.net bezig :> )
Meest eenvoudig:

Geef in de querystring het aantal HtmlInputFile dat gegenereerd moet worden. Maak deze vervolgens aan tijdens de Init of override CreateChildControls :) Je controlcollection blijft vervolgens op orde bij de postback en dan gaat het uitlezen wel goed :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 16:32

pistole

Frutter

Even offtopic:
C#:
1
2
//Aantal velden in hidden field zetten (die al bestaat) 
AantalVelden.Value = OpgegevenWaarde.ToString();             

Dit doe je "OpgegevenWaarde" keer. Niet echt nuttig ;)

Ik frut, dus ik epibreer


  • Razr
  • Registratie: September 2005
  • Niet online
pistole schreef op donderdag 18 januari 2007 @ 21:58:
Even offtopic:
C#:
1
2
//Aantal velden in hidden field zetten (die al bestaat) 
AantalVelden.Value = OpgegevenWaarde.ToString();             

Dit doe je "OpgegevenWaarde" keer. Niet echt nuttig ;)
Inderdaad, is gefixed.
gorgi_19 schreef op donderdag 18 januari 2007 @ 21:56:
[...]

Meest eenvoudig:

Geef in de querystring het aantal HtmlInputFile dat gegenereerd moet worden. Maak deze vervolgens aan tijdens de Init of override CreateChildControls :) Je controlcollection blijft vervolgens op orde bij de postback en dan gaat het uitlezen wel goed :)
Bedankt voor je snelle reactie, maar ik snap er niets meer van. Ik krijg geeneens meer de waarde in de adresbalk :'(

Ik kan geen forms nestelen binnen een UserControl.. Ik zou niet weten hoe ik het anders moet doen zonder een method=get manier..

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

In de handler van je postback (de button van selecteren) een response.Redirect uitvoeren en hier de querystring in zetten :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Razr
  • Registratie: September 2005
  • Niet online
gorgi_19 schreef op donderdag 18 januari 2007 @ 22:55:
In de handler van je postback (de button van selecteren) een response.Redirect uitvoeren en hier de querystring in zetten :)
Maar omdat ik met die views werkt lukt dat niet ? Ik word dan wel geredirected met inderdaad de goede queryString, maar mijn ActiveView komt weer op 1. Terwijl de button event deze juist raised naar 2, hierdoor blijf ik op dezelfde pagina.

Moet ik nou met nog een QueryString waarde gaan afvangen welke view moet worden weergeven? Dan zou het wel werken na een redirect, maar is dat wel de bedoeling van een view?

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Ow ja.. Views.. :P * gorgi_19 werkt niet met die dingen :P
Je kan evt. ook nog die 10 HtmlInputFile standaard toevoegen en de Visible op false zetten en naar gelang je dropdownwaarde het aantal controls op True te zetten :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Razr
  • Registratie: September 2005
  • Niet online
gorgi_19 schreef op donderdag 18 januari 2007 @ 23:12:
Ow ja.. Views.. :P * gorgi_19 werkt niet met die dingen :P
Je kan evt. ook nog die 10 HtmlInputFile standaard toevoegen en de Visible op false zetten en naar gelang je dropdownwaarde het aantal controls op True te zetten :)
He inderdaad! Dat is slim, dat bespaart een hoop gedoe :) Ik ga gelijk verder, bedankt :D

  • Razr
  • Registratie: September 2005
  • Niet online
Ik heb nog een klein vraagje maar deze is eigenlijk geeneens topic waardig...

Hoe kan ik alle controls in een loop uitlezen? De controls heten FileUpload1 t/m 10 maar ik kan bijv. niet doen

C#:
1
2
3
4
for (int i = 0; i < 11; i++)
{
    FileUpload + i.HasFile;
}


Hoe kan ik die naam dynamisch maken ? (ik kom van php af dit is wennen, maar fijn dat je me wilt helpen!)

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

FindControl gebruiken :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Razr
  • Registratie: September 2005
  • Niet online
Oke het werkt bijna :9

Dit gebeurt er in de Page_Init:
C#:
1
2
3
4
5
6
7
8
        for (int i = 1; i < 11; i++)
        {
            HtmlInputFile FileUpload = new HtmlInputFile();
            FileUpload.ID = "FileUpload" + i;
            FileUpload.Name = "FileUpload" + i;

            UploadVelden.Controls.Add(FileUpload);
        }


Dan vervolgens dit gecalled van de Page_Load:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        for (int i = 1; i < 11; i++)
        {
            HtmlInputFile FotoUpload = UploadVelden.FindControl("FileUpload" + i) as HtmlInputFile;

            //Hieronder de gegevens van het geuploadde bestand uitlezen
            if (FotoUpload != null)
            {
                //
                fotoUitslagLabel.Text = "Naam :" + FotoUpload.PostedFile.FileName;
            }
            else
            {
                fotoUitslagLabel.Text += "<p class=FCheckR>In veld nr. " + i + " is geen bestand gevonden.</p>";
            }
            
            
        }

Maar ik kan niets vinden om op te controleren, zodra een veld is gesubmitted is FotoUpload al geen null meer.
En op de een of andere manier kan ik geen .HasFile gebruiken :? Hoe moet ik nou checken of FotoUpload een bestand bevat?

Edit:
Het werkt nu :D
Ik check nu met
C#:
1
2
3
4
if(FotoUpload.value != "")
{
    //doe wat
}

is dit de beste manier ? Iig hardstikke bedankt he !

[ Voor 255% gewijzigd door Razr op 19-01-2007 01:22 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Je kan ook kijken of PostedFile Nothing is :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1