Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[asp.net]Validatie per DataGrid row

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26
Stel je onderstaande code voor:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<asp:DataGrid ID="dgrid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
       <label>Naam: </label>    
       <asp:RequiredFieldValidator 
              ID="NameRequired" runat="server" 
              ErrorMessage="Name is required" 
              ControlToValidate="txtName">*
       </asp:RequiredFieldValidator>
       <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
       <asp:Button ID="btnSend" runat="server" Text="Send Information" />
       <br />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>

Met, om te testen de volgende datasource:
C#:
1
2
3
        int[] amount = new int[2];
        dgrid.DataSource = amount;
        dgrid.DataBind();


Nu wordt in het ItemCommand de validator getriggerd. Alleen wil ik die per DataGridRow hebben. Zodra er nu geklikt wordt, worden alle txtName's gevalideerd, terwijl ik alleen de validatie op de specifieke DataGridRow wil hebben, en niet allemaal.

Ik dacht simpel te zijn, door een validationgroup aan de te valideren controls te hangen:
C#:
1
 ValidationGroup="melp"
Dit zorgt er nog steeds voor dat alle txtName's gevalideerd worden.

Als laatste mogelijkheid ben ik door de ItemCreated en de ItemDataBound heen gestepped om te zien of ik daar de specifieke controls voorbij zag komen, zodat ik er een unieke validationgroup aan kon hangen, maar ik zag de controls niet in de controlcollection staan. Nu betwijfel ik of dat ik de way to go was, maar goed.

edit
Nog even verder geprutst in het ItemCommand: (en op het Validator control "EnableClientScript" op false gezet)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        foreach (Control c in e.Item.Controls)
        {
            foreach (Control item in c.Controls)
            {
                TextBox tb = item as TextBox;
                if (tb != null)
                {
                    if (tb.ID=="txtName" && tb.Text == "")
                    {
                        
                    }
                }
            }
        }

Met deze code kan ik wel bij de textbox komen, alleen zou ik eventjes niet weten hoe ik de betreffende textbox 'invalid' kan maken.

</edit>

Heeft iemand een tip voor bovenstaand issue of ik kan ik het wel vergeten?

[ Voor 14% gewijzigd door TeeDee op 20-11-2007 21:51 ]

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


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:43

gorgi_19

Kruimeltjes zijn weer op :9

Over optie 1
Waarom doe je tijdens het binden tijden een ItemDataBound de validationgroup goed zetten (en laten varieren per row)

Over je optie 2:
Waarom gebruik je een e.item.FindControl('IdTextBox'). Hetzelfde truukje kan je doen met de validator en die zet je op 'isValid' = False. Ook zet je dan een boolean en voor het opslaan controleer je deze boolean of die true / false is.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26
Ben er zojuist nog even mee verder gegaan en ben richting optie 1 (gorgi_19's voorstel) gegaan.
In de ItemDataBound het volgende:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        foreach (Control c in e.Item.Controls)
        {
            AddressEntry addEntry = c as AddressEntry;
            if (addEntry != null)
            {
                foreach (Control m in addEntry.Controls)
                {
                    TextBox tb = m as TextBox;
                    if (tb != null)
                    {
                        tb.ValidationGroup = "Melp" + e.Item.ItemIndex;
                    }
                    Button btn = m as Button;
                    if (btn != null)
                    {
                        btn.ValidationGroup = "Melp" + e.Item.ItemIndex;
                    }
                    RequiredFieldValidator val = m as RequiredFieldValidator;
                    if (val != null)
                    {
                        val.ValidationGroup = "Melp" + e.Item.ItemIndex;
                    }
                }
            }
        }

Het zal op dit moment even geen schoonheidsprijs verdienen, maar in mijn testcase heb ik het nu perfect aan de praat gekregen.

Kreeg vanochtend ook nog een heldere ingeving om te googlen: [google=asp.net row validation]

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


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:43

gorgi_19

Kruimeltjes zijn weer op :9

Waarom loop je door alle controls heen en gebruik je geen findcontrol? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26
Omdat de te vinden controls in een UserControl zitten.

Hmm, die zou ik ook eerst met e.item.findcontrol kunnen opsnorren. Even verder rommelen.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AddressEntry uc = (AddressEntry)e.Item.FindControl("AddressEntry1");
TextBox naam = (TextBox)uc.FindControl("txtNaam");
Button btn = (Button)uc.FindControl("btnRefreshBack");
RequiredFieldValidator val = (RequiredFieldValidator)uc.FindControl("RequiredFieldValidator1");
if (naam != null)
{
    naam.ValidationGroup = "Melp" + e.Item.ItemIndex;
}
if (btn!= null)
{
    btn.ValidationGroup = "Melp" + e.Item.ItemIndex;
}
if (val!= null)
{
    val.ValidationGroup = "Melp" + e.Item.ItemIndex;
}

^^ Dat is inderdaad iets overzichtelijker. Tot nu toe. Wat nu als ik 12 TextBoxes heb? Dan lijkt het me makkelijker, netter om in een foreach de hele handel goed te zetten. Okay, je loopt dan wel over de controlcollection heen.

[ Voor 119% gewijzigd door TeeDee op 21-11-2007 09:42 ]

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


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26
Zo, en dan nu de volledige oplossing zoals ik 'm zie:

Het UserControl AddressEntry heeft nu een propertie "ValidationGroup" gekregen.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
protected void Page_Load(object sender, EventArgs e)
{
    txtNaam.ValidationGroup = ValidationGroup;
    reqtxtNaam.ValidationGroup = ValidationGroup;
    btnRefreshBack.ValidationGroup = ValidationGroup;
    //stuk of 20 andere controls welke tot deze group horen
}
private string _validationgroup = "";
public string ValidationGroup
{
    get { return _validationgroup; }
    set { _validationgroup = value; }
}

Vervolgens wordt in de ItemDataBound van de Repeater het volgende geplaatst:
C#:
1
2
AddressEntry uc = (AddressEntry)e.Item.FindControl("AddressEntry1");
uc.ValidationGroup = "Melp" + e.Item.ItemIndex;

Op deze manier hoef ik zelf niet met FindControl aan de slag, en mocht er een ID veranderen, zal ik dat zien in de Compiler.

Edit
Goed, toch gaat het niet goed. Dit komt, omdat de Repeater pas na een Event getoond wordt.
Even verder rommelen maar weer. Zonder het Event gaat het perfect.

[ Voor 8% gewijzigd door TeeDee op 21-11-2007 10:31 ]

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


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:43

gorgi_19

Kruimeltjes zijn weer op :9

Goed, toch gaat het niet goed. Dit komt, omdat de Repeater pas na een Event getoond wordt.
:? Leg eens uit als je wil? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26
Ach, door gesprekken, lunch e.d. is 't wat later geworden.

Ter illustratie (en even helemaal uitgetikt):
Ik heb een invullen.aspx. Daarin staat een panel (pnlVragen) waar een aantal vragen ingevuld moeten worden met een submitbutton.

Vervolgens wordt in de SubmitEvent het e.e.a. opgeslagen en wordt het aantal RepeaterItems bepaald. Op invullen.aspx wordt pnlVragen verborgen en wordt pnlGegevens met de Repeater getoond. In het ItemDataBound worden de ValidationGroups 'uniek' aangemaakt.

Als je nu dus vanuit het AddressEntry UserControl een ButtonClick doet (wat dus in feite een RepeaterItemCommand is) dan lijkt het erop alsof alle ValidationGroups weer weg zijn.

Het gaat dus een beetje mis met Postbacks e.d.

Maar ik heb het op dit moment inmiddels werkend.

Haal ik het hele pnlVragen gedeelte over naar een andere pagina (zeg default.aspx) en redirect naar invullen.aspx (nadat een aantal properties geset zijn) dan krijg ik wel netjes per RepeaterRow een ValidationGroup. In de page_load van invullen.aspx bind ik de Repeater simpelweg. Ik check ook niet op Postback in dit geval.

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

Pagina: 1