Ik beschik over een database met 3 tabellen:
- model (modelid, modelnaam)
- domein (domeinid, modelid, domeinnaam)
- criteria (criteriaid, domeinid, criterianaam)
Een model bevat dus meerdere domeinen, terwijl een domein meerdere criteria bevat.
Mijn doel is nu om de data in deze tabellen weer te geven dmv nested gridviews.
bv.
Model 1
<Columns>
<asp:BoundField DataField="modelnaam" HeaderText="Modelnaam" SortExpression="modelnaam" />
<asp:TemplateField HeaderText="Domeinen">
<ItemTemplate>
<asp:GridView ID="gvDomein" runat="server" ShowHeader="False" OnRowDataBound="gvDomein_rowDataBound">
<Columns>
<asp:TemplateField HeaderText="Criteria">
<ItemTemplate>
<asp:GridView ID="gvCriteria" runat="server" ShowHeader="False">
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>[/code=asp]
[code=c#] protected void gvModel_rowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
using (SqlConnection Sconn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Evaluatie"].ConnectionString))
{
GridView gvDomein = (GridView)e.Row.FindControl("gvModel");
SqlDataReader SDataReader;
SqlCommand Scomm = new SqlCommand();
Scomm.CommandText = "SELECT domeinid, domeinnaam FROM domein WHERE modelid=" + ((DataRowView)e.Row.DataItem)["modelid"].ToString();
Scomm.CommandType = CommandType.Text;
Scomm.Connection = Sconn;
Scomm.Connection.Open();
SDataReader = Scomm.ExecuteReader();
// gridview aanmaken
gvDomein.DataSource = SDataReader;
gvDomein.AutoGenerateColumns = false;
BoundField bfDomeinID = new BoundField();
bfDomeinID.DataField = "domeinid";
BoundField bfDomeinnaam = new BoundField();
bfDomeinnaam.DataField = "domeinnaam";
gvDomein.Columns.Add(bfDomeinID);
gvDomein.Columns.Add(bfDomeinnaam);
gvDomein.DataBind();
}
}
}[/code=C#]
In het geval van gvDomein_rowDataBound(), zou dat dan gewoon een kopie zijn van het bovenstaande die dan gewoon de criteria ophaalt.
Nu krijg ik 'De objectverwijzing is niet op een exemplaar van een object ingesteld.'
bij het stuk 'gvDomein.DataSource = SDataReader;'
Is dit uberhaupt de goede manier waarop ik dit probleem probeer aan te pakken? Waar doe ik het precies fout?
- model (modelid, modelnaam)
- domein (domeinid, modelid, domeinnaam)
- criteria (criteriaid, domeinid, criterianaam)
Een model bevat dus meerdere domeinen, terwijl een domein meerdere criteria bevat.
Mijn doel is nu om de data in deze tabellen weer te geven dmv nested gridviews.
bv.
Model 1
- [ul]Domein 1[/ul] [list=1] [ul]Criteria 1[/ul] [ul]Criteria 2[/ul] [/list] [ul]Domein 2[/ul] [list=1] [ul]Criteria 1[/ul] [ul]Criteria 2[/ul] [/list]
<Columns>
<asp:BoundField DataField="modelnaam" HeaderText="Modelnaam" SortExpression="modelnaam" />
<asp:TemplateField HeaderText="Domeinen">
<ItemTemplate>
<asp:GridView ID="gvDomein" runat="server" ShowHeader="False" OnRowDataBound="gvDomein_rowDataBound">
<Columns>
<asp:TemplateField HeaderText="Criteria">
<ItemTemplate>
<asp:GridView ID="gvCriteria" runat="server" ShowHeader="False">
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>[/code=asp]
[code=c#] protected void gvModel_rowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
using (SqlConnection Sconn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Evaluatie"].ConnectionString))
{
GridView gvDomein = (GridView)e.Row.FindControl("gvModel");
SqlDataReader SDataReader;
SqlCommand Scomm = new SqlCommand();
Scomm.CommandText = "SELECT domeinid, domeinnaam FROM domein WHERE modelid=" + ((DataRowView)e.Row.DataItem)["modelid"].ToString();
Scomm.CommandType = CommandType.Text;
Scomm.Connection = Sconn;
Scomm.Connection.Open();
SDataReader = Scomm.ExecuteReader();
// gridview aanmaken
gvDomein.DataSource = SDataReader;
gvDomein.AutoGenerateColumns = false;
BoundField bfDomeinID = new BoundField();
bfDomeinID.DataField = "domeinid";
BoundField bfDomeinnaam = new BoundField();
bfDomeinnaam.DataField = "domeinnaam";
gvDomein.Columns.Add(bfDomeinID);
gvDomein.Columns.Add(bfDomeinnaam);
gvDomein.DataBind();
}
}
}[/code=C#]
In het geval van gvDomein_rowDataBound(), zou dat dan gewoon een kopie zijn van het bovenstaande die dan gewoon de criteria ophaalt.
Nu krijg ik 'De objectverwijzing is niet op een exemplaar van een object ingesteld.'
bij het stuk 'gvDomein.DataSource = SDataReader;'
Is dit uberhaupt de goede manier waarop ik dit probleem probeer aan te pakken? Waar doe ik het precies fout?