I'm using ASP.NET Repeater for dynamically generating HTML code and pagination. I use totally same code on two aspx pages and on one all works fine, but on the other one I get an Exception: Object reference not set to an instance of an object.
Now I understand why the exception occurred, it simply has a null value, repeater didn't render I guess. But does anyone know why this error happened and how it's possible that it works on one page, and doesn't work on the other? Where should I look for "real" problem?
This is my HTML code on the aspx page:
<div class="accordion-wrap projects">
<asp:Repeater runat="server" ID="projectRepeter">
<ItemTemplate>
<div class="item">
<div class="heading">
<span>
<asp:Label runat="server" ID="TeamMemberName" Text='<%#Eval("ProjectName")%>'></asp:Label></span><span><em>x</em></span>
<i>+</i>
</div>
<div class="details">
<ul class="form">
<li>
<label>Project name:</label>
<input type="text" class="in-text" value="<%#Eval("ProjectName")%>" />
</li>
<li>
<label>Lead:</label>
<asp:DropDownList runat="server" DataSourceID="TeamMemberNameDS"></asp:DropDownList>
</li>
</ul>
<ul class="form">
<li>
<label>Description:</label>
<input type="text" class="in-text" value="<%#Eval("Description")%>" />
</li>
</ul>
<ul class="form last">
<li>
<label>Customer:</label>
<asp:DropDownList runat="server" DataSourceID="ClientNameDS"></asp:DropDownList>
</li>
<li class="inline">
<label>Status:</label>
<span class="radio">
<label for="inactive">Active:</label>
<input type="radio" value="1" name="status" id="inactive" />
</span>
<span class="radio">
<label for="active">Inactive:</label>
<input type="radio" value="2" name="status" id="active" />
</span>
<span class="radio">
<label for="active">Archive:</label>
<input type="radio" value="3" name="status" id="Radio1" />
</span>
</li>
</ul>
<div class="buttons">
<div class="inner">
<a href="javascript:;" class="btn green">Save</a>
<a href="javascript:;" class="btn red">Delete</a>
</div>
</div>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
</div>
<div class="pagination">
<asp:Repeater ID="rptPagingProject" runat="server" OnItemCommand="rptPaging_ItemCommand">
<ItemTemplate>
<asp:LinkButton ID="btnPage"
CommandName="Page" CommandArgument="<%# Container.DataItem %>" runat="server" ForeColor="Black" Font-Bold="True"><%# Container.DataItem %>
</asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
</div>
And this is the code behind:
protected void BindRepeater()
{
string ConnectionString = "Data Source=PRACTICE-001;Initial Catalog=n.mosorinski;User ID=n.mosorinski;Password=n.mosorinski;MultipleActiveResultSets=True;Application Name=EntityFramework";
SqlConnection con = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand("SELECT p.ProjectName, p.Description, c.ClientName FROM Project AS p INNER JOIN Client AS c ON p.CustomerID = c.ClientID", con);
if (con.State == ConnectionState.Closed)
{
con.Open();
}
DataTable dt = new DataTable();
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
PagedDataSource pgitems = new PagedDataSource();
DataView dv = new DataView(dt);
pgitems.DataSource = dv;
pgitems.AllowPaging = true;
pgitems.PageSize = 5;
pgitems.CurrentPageIndex = PageNumber;
if (pgitems.PageCount > 1)
{
rptPagingProject.Visible = true;
ArrayList pages = new ArrayList();
for (int i = 0; i < pgitems.PageCount; i++)
pages.Add((i + 1).ToString());
rptPagingProject.DataSource = pages;
rptPagingProject.DataBind();
}
else
{
rptPagingProject.Visible = false;
}
projectRepeter.DataSource = pgitems;
projectRepeter.DataBind();
}
public int PageNumber
{
get
{
if (ViewState["PageNumber"] != null)
return Convert.ToInt32(ViewState["PageNumber"]);
else
return 0;
}
set
{
ViewState["PageNumber"] = value;
}
}
protected void rptPaging_ItemCommand(object source, RepeaterCommandEventArgs e)
{
PageNumber = Convert.ToInt32(e.CommandArgument) - 1;
BindRepeater();
}
}