[asp.net] Dynamisch ItemTemplate waarde achterhalen

Pagina: 1
Acties:

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Ik heb hier een dtagrid dat dynamisch gevuld wordt met kolommen, gemaakt volgens dit msdn artikel. Ik heb het itemtemplate hiervan aangepast om een checkbox te bevatten. Uit de database komen de volgende gegevens:
code:
1
2
3
4
5
6
7
product1 product2
1             0
0             0
1             1
1             0
0             1
etc...
De 1 of 0 moet bepalen of de checkbox aan of uit staat. Nu vraag ik me alleen af hoe ik de waarde van een bepaald item kan benaderen?

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
In de OnItemDataBound event kan je dat doen, en dan moet je eens kijken naar de methods en properties van het DataGridItemEventArgs object dat je meekrijgt.

[ Voor 56% gewijzigd door whoami op 05-04-2004 12:13 ]

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Ik kom er nog niet helemaal uit. Ik kan de itemindex aanroepen met
code:
1
e.Item.ItemIndex
maar hoe ik nu bij de achterliggende waarde kom van de dataset weet ik nog niet

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
code:
1
e.Item.DataItem


Bevat het 'data-item' dat getoond wordt in de rij van je grid die 'nu' ge-databound wordt.
Als de DataSource van je grid een DataTable of DataSet is, kan je dat dataitem casten naar een DataRow.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Ok, dat lukt.
Ik probeer nu de checkbox te benaderen met de volgende regel:
code:
1
CheckBox c = (System.Web.UI.WebControls.CheckBox)keyGrid.Items[e.Item.ItemIndex].FindControl("checkbox");
Ik haal maar 1 regel uit de databsae op dit moment dus de index is 0. (e.Item.ItemIndex is ook 0). Toch krijg ik de foutmelding "Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
"
Ik snap het niet?

Edit:
OK, het begint al aardig te werken. Ik akn de checkbox aanroepen met
code:
1
CheckBox c = (System.Web.UI.WebControls.CheckBox)e.Item.FindControl("cbEen product");
Het zou nu alleen nog mooi zijn al ik de checkbox aan de hand van een index in de itemarray kan aanroepen.

[ Voor 35% gewijzigd door sig69 op 05-04-2004 16:58 ]

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
sig69 schreef op 05 april 2004 @ 14:40:
Ok, dat lukt.
Ik probeer nu de checkbox te benaderen met de volgende regel:
code:
1
CheckBox c = (System.Web.UI.WebControls.CheckBox)keyGrid.Items[e.Item.ItemIndex].FindControl("checkbox");
Ik haal maar 1 regel uit de databsae op dit moment dus de index is 0. (e.Item.ItemIndex is ook 0). Toch krijg ik de foutmelding "Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
"
Ik snap het niet?
Je moet ook weten dat die code ook aangeroepen wordt bij de header van je datalist.
Dat moet je dus even afvangen.

code:
1
2
3
if( e.Item.ItemType == ListItemType.Item )
{
}

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Zoiets had ik al, maar dan
code:
1
2
3
if (e.Item.ItemIndex >= 0)
{
}
(header en footer zijn -1).

Als ik
code:
1
2
3
if( e.Item.ItemType == ListItemType.Item )
{
}
gebruik, dan mis ik een aantal resultaten op de een of andere manier.
Verder werkt het hele apparaat nu als een trein, bedankt!

(dit stukje code verdwijnt in de persoonlijke code-database)

[ Voor 22% gewijzigd door sig69 op 06-04-2004 09:27 ]

Roomba E5 te koop


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:50

gorgi_19

Kruimeltjes zijn weer op :9

Je vergeet ook om AlternateItem te laten zien.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Haha! Duh, je hebt gelijk (dom zeg...)

Ok nu heb ik een ander probleem, ik doe waarschijnlijk iets fout in de volgorde ofzo.
code:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
namespace blaat.blaat
{
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Configuration;

    public class key_assignment : System.Web.UI.UserControl
    {
        protected System.Web.UI.WebControls.Label customerNameLabel;
        protected System.Web.UI.WebControls.Button saveButton;
        protected System.Web.UI.WebControls.DataGrid keyGrid;
        protected System.Web.UI.WebControls.DataGrid availableKeyGrid;

        public static SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["connString"]);
        protected System.Web.UI.WebControls.DropDownList customerDropDown;
        protected System.Web.UI.WebControls.Button keyButton;
        
        public DataSet assignmentSet = new DataSet();
        
        private void Page_Load(object sender, System.EventArgs e)
        {           
            if(!Page.IsPostBack)
            {
                // Dataset for the customers
                DataSet customerSet = new DataSet();                
                // Get all customers for dropdownlist
                SqlDataAdapter customerAdapter = new SqlDataAdapter("crm_getCustomersDropDown", myConnection);
                customerAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;                    
                customerAdapter.Fill(customerSet, "crm_getCustomersDropDown");
                customerDropDown.DataSource=customerSet.Tables["crm_getCustomersDropDown"].DefaultView;
                customerDropDown.DataTextField = "customerName";
                customerDropDown.DataValueField = "id";
                customerDropDown.DataBind();
            }
        }
        
        public void bindKeys()
        {
            // Haal de hele meute op
            // weggeknip tbv overicht
            keyGrid.DataBind();
        }
        
        public void evaluateCheckBox(Object sender, DataGridItemEventArgs e) 
        {   
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DataRowView row = (DataRowView)e.Item.DataItem;
                
                foreach(DataColumn _column in assignmentSet.Tables[0].Columns)
                {
                    if(!_column.Equals(assignmentSet.Tables[0].Columns[0])) // HIER GAAT HET FOUT!!!
                    {
                        string strColumn = "cb" + _column.Caption.ToString();
                        CheckBox c = (System.Web.UI.WebControls.CheckBox)e.Item.FindControl(strColumn);
                        if (Int32.Parse(row.Row.ItemArray[_column.Ordinal].ToString()) == 1)
                        {
                            c.Checked = true;
                        }
                        else
                        {
                            c.Checked = false;
                        }
                    }
                }
            }
        }
        

        private void keyButton_Click(object sender, System.EventArgs e)
        {
            bindKeys();
        }
    }
    
    // Custom datagrid templatecolumn class
    public class DataGridTemplate : ITemplate
    {
        // Weggeknipt tbv overzicht
    }

}

De eerste postback gaat goed, het datagrid wordt netjes gevuld. Als ik nog een keer op de knop druk dan krijg ik de foutmelding "System.IndexOutOfRangeException: Cannot find table 0." op de aangegeven regel. Is mijn dataset dan niet meer beschikbaar?

[ Voor 98% gewijzigd door sig69 op 06-04-2004 12:20 ]

Roomba E5 te koop


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
*kickje*

Ben er nog niet uit helaas.

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Nee, je datatable is weg.
Lees eens iets over de creatie van pagina's in asp.net.

Eens je pagina in de browser zichtbaar is, bestaat hij niet meer op de server. Alle variabelen zijn dan ook niet meer beschikbaar.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Maar zodra de "keyButton_Click" wordt uitgevoerd (postback), wordt de data toch opnieuw opgehaald?

Roomba E5 te koop


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
Nee, juist niet.
Je zegt in je page_load nl. zelf
code:
1
if( !IsPostBack )

Je haalt ze dus enkel op als er geen postback is.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:50

gorgi_19

Kruimeltjes zijn weer op :9

Waar dan? assignmentSet is leeg.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:32
gorgi_19 schreef op 07 april 2004 @ 11:33:
Waar dan? assignmentSet is leeg.
Ook.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Het gedeelte in de
code:
1
2
3
if (!Page.IsPostBack)
{
}

Haalt alleen een aantal klantnamen op. De gegevens waar het echt om gaat zit hier:
code:
1
2
3
4
5
6
public void bindKeys()
{
// Haal de hele meute op
// weggeknip tbv overicht
keyGrid.DataBind();
}
De specifiek code heb ik even weggehaald omdat het anders erg groot wordt. Deze methode wordt door de "keyButton_Click" aangeroepen. Je zou dus verwachten dat deze code bij elke postback wel uitgevoerd wordt.

Roomba E5 te koop


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:05
Voor de geinteresseerden: ik weet nu waarom het fout gaat. De evaluateCheckBox() methode wordt aangeroepen in de OnItemCreated event van het datagrid. Dit wordt dus ook uitgevoerd op het moment dat de pagina vernietigd wordt (ja logisch :X). Nu nog een oplossing verzinnen..

Roomba E5 te koop

Pagina: 1