Programmatically modifying the controls in FormView's PagerTemplate

  • Thread starter Thread starter Nathan Sokalski
  • Start date Start date
N

Nathan Sokalski

I am trying to create a FormView controls in which I access and modify the
the controls in the PagerTemplate programmatically. However, I continue to
recieve the following error:

Object reference not set to an instance of an object.

I am attempting to access the controls in my PagerTemplate using the
following code:

CType(Me.fviewPhotoAlbum.FindControl("lnkPhotoAlbum"), LinkButton)


I have tried doing this from all the events that I could think of and that I
noticed mentioned on any help sites I could find, but it didn't help. I
don't know what I am doing wrong, if anyone could help me I would greatly
appreciate it. Thanks.
 
Because this is my first time using the FormView control (although I have
had plenty of experience with the DataList control, so I have used templates
before), I tried putting it in the Page's Load eventhandler. Something that
I saw on the Internet said to put it in the FormView control's ItemCreated
eventhandler, but that didn't work either. Here is the code I have in my
Page's Load eventhandler:

Private Sub index_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load

Dim photoalbum As New DataTable

Dim dataadapterSelect As New System.Data.OleDb.OleDbDataAdapter("SELECT *
FROM babyphotos ORDER BY photodate,filename",
System.Configuration.ConfigurationManager.AppSettings("connectionstring"))

dataadapterSelect.Fill(photoalbum)

Me.fviewPhotoAlbum.DataSource = photoalbum

Me.fviewPhotoAlbum.DataBind()

'Hide unnecessary numeric LinkButtons

For i As Integer = 1 To 10

CType(Me.fviewPhotoAlbum.FindControl("lnkPhotoAlbum" & CStr(i)),
LinkButton).Visible = (i <= photoalbum.Rows.Count)

Next

End Sub


The basic goal of this code is to not show more numeric controls than
necessary (I don't want to show 10 controls if there are only 5 records).
Here is my FormView control:

<asp:FormView ID="fviewPhotoAlbum" runat="server" AllowPaging="True"
HorizontalAlign="Center">

<PagerSettings NextPageImageUrl="images/NextBtn.gif"
PreviousPageImageUrl="images/PrevBtn.gif" Mode="NextPrevious"/>

<rowstyle HorizontalAlign="Center"/>

<ItemTemplate>

<asp:Image ID="imgPhoto" runat="server" BorderWidth="0px"
ImageAlign="Middle" ImageUrl='<%#
DataBinder.Eval(Container,"DataItem.filename","images/photoalbum/{0}")
%>'/><br/>

<asp:Label ID="lblPhotoCaption" runat="server"
AssociatedControlID="imgPhoto" Text='<%#
DataBinder.Eval(Container,"DataItem.caption") %>'/><br/>

<asp:Label ID="lblPhotoDate" runat="server" AssociatedControlID="imgPhoto"
Text='<%# DataBinder.Eval(Container,"DataItem.photodate","Photo taken on:
{0:D}") %>'/>

</ItemTemplate>

<PagerTemplate>

<asp:ImageButton ID="imgPrevious" runat="server" AlternateText="Previous
Photo" BorderWidth="0px" CausesValidation="False" CommandArgument="Prev"
CommandName="Page" Height="35px" ImageUrl="images/PrevBtn.gif"
Width="35px"/>&nbsp;

<asp:LinkButton ID="lnkPhotoAlbum1" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum2" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum3" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum4" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum5" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum6" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum7" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum8" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum9" runat="server" CausesValidation="false"
CommandName="Page"/>

<asp:LinkButton ID="lnkPhotoAlbum10" runat="server" CausesValidation="false"
CommandName="Page"/>&nbsp;

<asp:ImageButton ID="imgNext" runat="server" AlternateText="Next Photo"
BorderWidth="0px" CausesValidation="False" CommandArgument="Next"
CommandName="Page" Height="35px" ImageUrl="images/NextBtn.gif"
Width="35px"/>

</PagerTemplate>

</asp:FormView>


Thanks.
 
Hi. Perhaps that I'm going 2 tell U dont be a solution but i was trying somthing similar to your code.

First of all, you must place your code in the ItemCreated event. There you can acces the current DataRowView and DataItem container. In the DataRowView you can find your control in the way you're doing, and int the DataItem you can get your data source fields. You have it all!!!

Well, it's important to notice that controls are not always in the FormView. It depends on CurrentMode, so my advice is to check always the mode the control is going to load

My code looks like that:
protected void FormView1_ItemCreated(object sender, EventArgs e)
{
if (FormView1.CurrentMode == FormViewMode.Edit)
{
//selected value
DropDownList ddl = ((DropDownList)FormView1.FindControl("ddlProf"));
if ((ddl != null) && (ddl.Items.Count > 0))
ddl.SelectedValue = Convert.ToString(DataBinder.Eval(FormView1.DataItem, "ID_Profesor"));
}
}

To finish the post, i add another workaround. You can define the DataBinding event to your control (In my case, the dropdownlist). In the event handler, use the NamingContainer to acces the FormView and DataItem. Something like:
protected void ddlProf_DataBinding(object sender, EventArgs e)
{
DropDownList ddl = ((DropDownList)sender);
FormView fView = (FormView)ddl.NamingContainer;
DataRowView rowView = (DataRowView)fView.DataItem;
if (!System.DBNull.Value.Equals(rowView["ID_Profesor"]))
ddl.SelectedValue = rowView["ID_Profesor"].ToString();
}

Well, I hope that can help you in any way. If not, please, contact me

EggHeadCafe.com - .NET Developer Portal of Choice
http://www.eggheadcafe.com
 
Back
Top