DetailsView ItemCommand Index outside the bounds of the array - vb.net

I have the following DetailsView defined with a DropDownList of data and an Add ButtonField:
<asp:DetailsView ID="dvNewEntry" runat="server" Height="50px" Width="800px"
AutoGenerateRows="False" CssClass="gv_footer" BorderColor="Black"
BorderStyle="Solid" BorderWidth="2px" CellPadding="5" CellSpacing="8">
<FieldHeaderStyle CssClass="th_right" />
<Fields>
<asp:TemplateField HeaderText="Account Name">
<ItemTemplate>
<asp:Label ID="lblNewAcct" runat="server" Text='<%# Eval("ACCT_LIST") %
>'></asp:Label>
</ItemTemplate>
<InsertItemTemplate>
<asp:DropDownList ID="ddAcctList" runat="server" DataSourceID="LUWAcctList"
DataTextField="ACCT_LIST" DataValueField="ACCT_LIST"
SelectedValue='<%# Bind("ACCT_LIST") %>' Font-Size="Small" Width="600">
</asp:DropDownList>
</InsertItemTemplate>
</asp:TemplateField>
<asp:ButtonField ButtonType="Button" Text="Save" CommandName="Add"/>
</Fields>
</asp:DetailsView>
In the codebehind - I have the following ItemCommand sub.
Protected Sub dvNewEntry_ItemCommand(ByVal sender As Object, ByVal e As DetailsViewCommandEventArgs) Handles dvNewEntry.ItemCommand
If e.CommandName = "Add" Then
Dim newA As String
newA = Trim(CType(dvNewEntry.FindControl("ddAcctList"), DropDownList).Text)
etc. etc.
Everything works fine when the user selects a value from the dropdown list. But if they don't make a selection and click the Add button - I get the following error when I land on the "If e.CommandName = Add" line:
Index was outside the bounds of the array
How do I handle this exception? Thanks

If (e.[someproperty] IsNot Null) Then --> your code solved the problem. Thanks Tanner

Related

Changing a columns contents in a GridView from VB code

I am displaying a grid of data which includes a users name and profile pic etc.
If they haven’t uploaded a profile picture I have set the code below to set imgPic.ImageUrl = "~/files/images/blankProfilePic.png"
However, this works only for the 1st page of 6 pages of data displayed.. As soon as you switch to the 2nd page I get the missing picture icon as the code below is only working for the initial page displayed.
I need to change this code to work on every page as it is only called when the page loads.
VB CODE
Protected Sub Page_LoadComplete(sender As Object, e As System.EventArgs) Handles Me.LoadComplete
Dim acc As New accounts(Membership.GetUser.ProviderUserKey)
If acc.region = "North East" Then
For Each r As GridViewRow in gdvNorthEast.Rows
If r.RowType = DataControlRowType.DataRow Then
Dim imgPic As Image
imgPic = r.Cells(4).FindControl("imgProfilePic")
If imgPic.ImageUrl = "~/catalog/images/"
imgPic.ImageUrl = "~/files/images/blankProfilePic.png"
End If
End If
Next r
End If
ASP.NET
<asp:SqlDataSource
ID="DSLeaderboardNorthEast"
runat="server"
ConnectionString="<%$ ConnectionStrings:DBConnectionString %>"
SelectCommand="SELECT tblAccounts.contactName, tblAccounts.profilePic, tblAccounts.minAge, tblAccounts.maxAge, tblAccounts.AccountID, tblAccounts.region
FROM tblAccounts
WHERE tblAccounts.region='North East'
ORDER BY tblAccounts.contactName ">
</asp:SqlDataSource>
<asp:GridView ID="gdvNorthEast" width="100%" runat="server" AllowPaging="True" AutoGenerateColumns="False" CssClass="mGrid" DataKeyNames="accountID" DataSourceID="DSLeaderboardNorthEast" PageSize="20" AllowSorting="True">
<AlternatingRowStyle CssClass="alt" />
<Columns>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:Image ID="imgProfilePic" AlternateText="Players profile picture" runat="server" width="100px" height="100px" ImageUrl='<%# "~/catalog/images/" & Eval("ProfilePic").ToString %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="contactName" HeaderText="Player Name" />
<asp:BoundField DataField="minAge" HeaderText="Won" />
<asp:BoundField DataField="maxAge" HeaderText="Lost" />
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:HyperLink ID="hypMessage" runat="server" CssClass="nyroModalMsg" NavigateUrl='<%# "~/sendLeaderboardMessage.aspx?" & "&aID=" & Eval("accountID").ToString %>'>Msg</asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Your foreach loop for assigning default image should be reusable method.
Use PageIndexChanged event handler to call the same reusable method.
Update:
Since the above option is not helping, follow this post
//RowDataBound Event
protected void gdvNorthEast_RowDataBound(object sender, GridViewRowEventArgs e)
{
//Checking the RowType of the Row
if(e.Row.RowType==DataControlRowType.DataRow)
{
//your logic goes here without foreach loop
}
}
Use the Gridview_RowDataBound event to make the function of substitution instead use a for instruction

Exclude column in certain rows - SQL / Asp.Net

I'm wanting to change some code which was written for me. I would like to omit displaying the hyperlink where tblResults.videoLink=''
The hyperlink is displayed in the table as "Video Link" so people can click on it. I only want the words/hyperlink "Video Link" to appear in the row where people have entered one.
The code is Microsoft SQL but is written in the ASPX file. The back end is VB but there's VB is pretty much empty.. The ASPX file handles everything...
<h1>Recent Results</h1>
<asp:Panel ID="pnlMyWishes" runat="server">
<asp:SqlDataSource ID="DSWishes" runat="server" ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" SelectCommand="SELECT TOP (100) PERCENT tblResults.wishID, tblResults.Player1AccountID, tblResults.Player2AccountID, tblResults.Player1Result, tblResults.Player2Result, tblResults.venue, tblResults.potSize, tblResults.player1Name, tblResults.player2Name, tblResults.videoLink, tblResults.date FROM tblResults ORDER BY tblResults.date DESC">
</asp:SqlDataSource>
<asp:GridView ID="gdvWishes" width="100%" runat="server" AllowPaging="True" AutoGenerateColumns="False" CssClass="mGrid" DataKeyNames="wishID" DataSourceID="DSWishes" PageSize="20" AllowSorting="True">
<AlternatingRowStyle CssClass="alt" />
<Columns>
<asp:BoundField DataField="player1Name" HeaderText="Player 1" />
<asp:TemplateField HeaderText="Result">
<ItemTemplate>
<asp:Label ID="lblP1" Text='<%# Eval("player1Result").ToString %>' runat="server" Visible="true">
</asp:Label><asp:Label ID="lblVs" Text=" - " runat="server" Visible="true"></asp:Label>
<asp:Label ID="lblP2" Text='<%# Eval("player2Result").ToString %>' runat="server" Visible="true"></asp:Label>
</ItemTemplate>
<ItemStyle Width="17%" />
</asp:TemplateField>
<asp:BoundField DataField="player2Name" HeaderText="Player 2" />
<asp:BoundField DataField="potSize" HeaderText="Pot" />
<asp:BoundField DataField="venue" HeaderText="Venue" />
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:HyperLink ID="hypVideoLink" runat="server" NavigateUrl='<%# Eval("videoLink").ToString %>'>Video Link</asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:Panel>
Create a sub like below, call it after the code that fills your GridView with data.
Private Sub HideBlankURLs()
For Each r As GridViewRow in gdvWishes.Rows
If r.RowType = DataControlRowType.DataRow Then //Execute the code only for datarow, excluding footer and header
Dim hypURL As HyperLink
hypURL = r.Cells(5).FindControl("hypVideoLink") //Goes to the column of VideoURL, index 5 is counting from 0 to 5
If hypURL.NavigateURL = "" Then //Checks if the URL is blank, if it is then hide the hyperlink control
hypURL.Visible = False
End If
End If
Next r
End Sub
This will loop through all the rows and look for the control in that column, check if navigate URL is blank, then hide that control.
NOTE: Replace the (//) with single quote (') because SO reads it as text enclosing character rather than a comment.

OnUploadedComplete function of AsyncFileUpload is never hit in detailsview

I have an AsyncFileUpload control in a detailsview. I can browse to select a file to upload. When I start the upload the OnClientUploadComplete function uploadRoomThumbComplete method is executed, but the function in OnUploadedComplete is never hit.
Why?
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DetailsView AutoGenerateRows="False" DefaultMode="Edit" Width="100%" DataKeyNames="id" DataSourceID="odsDetails" ID="dvOfferDetails" runat="server">
<Fields>
<asp:TemplateField HeaderStyle-HorizontalAlign="Left" HeaderStyle-VerticalAlign="Bottom" HeaderText="<%$Resources:Glossary,image%>">
<EditItemTemplate>
<asp:literal ID="ltImage" runat="server" />
<p id="RoomContainer">
</p>
<asp:literal ID="ltDeleteRoomThumb" runat="server" />
<cc1:AsyncFileUpload CssClass="imageUploaderField" ID="afuRoomThumb" Width="150" runat="server" ClientIDMode="AutoID" OnUploadedComplete="afuRoomThumb_UploadedComplete" OnClientUploadComplete="uploadRoomThumbComplete" />
</EditItemTemplate>
</asp:TemplateField>
</Fields>
</ContentTemplate>
</asp:UpdatePanel>
Protected Sub afuRoomThumb_UploadedComplete(ByVal sender As Object, ByVal e As AjaxControlToolkit.AsyncFileUploadEventArgs)
'---> this codeblock is NEVER hit....why?
End Sub
Ok, I found the answer here: http://forums.asp.net/t/1477331.aspx?AsyncFileUpload+inside+a+GridView+inside+an+UpdatePanel
In short: place another AsyncFileUpload control on the page and set the style's display:none.
It seems that the AsyncFileUpload is designed to be used only once on a page, and when you put it on your master page, any afu inside an updatepanel will work.

Update TimeRecorded on edititemtemplate label vb.net

I'm trying to have a label in the edititemtemplate of my gridview show the current date and time when the user clicks the edit linkbutton. When I put date.now in the data binding box, I can see the result I want, but when I click update, I get an error that the field can't be null. It works fine when I try it for the footer row, but not the edit row. Here's the footer row code that works:
'Get Time Recorded
Dim lblFtrTimeRecorded As Label = GridView1.FooterRow.FindControl("lblFtrTimeRecorded")
lblFtrTimeRecorded.Text = Date.Now
Here's the template field .aspx code:
<asp:TemplateField HeaderText="TimeRecorded" SortExpression="TimeRecorded">
<EditItemTemplate>
<asp:Label ID="lblEditTimeRecorded" runat="server"
Text='<%# Bind("TimeRecorded") %>'></asp:Label>
</EditItemTemplate>
<FooterTemplate>
<asp:Label ID="lblFtrTimeRecorded" runat="server"></asp:Label>
</FooterTemplate>
<ItemTemplate>
<asp:Label ID="lblTimeRecorded" runat="server"
Text='<%# Bind("TimeRecorded") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Any help is greatly appreciated!
Write this code :
Dim lblFtrTimeRecorded As Label = GridView1.Rows[GridView1.EditIndex].FindControl("lblFtrTimeRecorded")
lblFtrTimeRecorded.Text = Date.Now

Linkbutton in a Datalist in a GridView

I have an interesting ASP/VB.NET problem. I have a gridview where each row has its own datalist in a template column. I want to add to each item in the datalist a linkbutton that will trigger an event based on data in the datalist. But I'm not sure how to do it. It's in a project so it has the designer file which does list the gridview but not the datalist inside the gridview. When I try to add it, the listing for the datalist is removed later on when I compile.
My question is now do I get the linkbutton in the datalist in the gridview to do something?
<asp:GridView ID="gvCmteNom" runat="server" AutoGenerateColumns="False" showheader="true" HeaderStyle-BackColor="Silver" Width="1600px">
<Columns>
<asp:TemplateField HeaderText="CURRENT SERVICE">
<ItemTemplate>
<asp:TextBox ID="txtID" runat="server" Text='<%# Bind("NOMINEE_ID") %>' Visible="False" Width="25px" />
<asp:DataList ID="dlCurrentCmtes" runat="server" DataSourceID="dsCurrentCmte" RepeatLayout="Flow" DataKeyField="ID" RepeatDirection="Horizontal">
<ItemTemplate>
<asp:HiddenField runat="server" ID="hdnUserID" Value='<%# Eval("ID") %>' />
<asp:Label ID="lblDescription" runat="server" Text='<%# Eval("Description") %>' />
<asp:LinkButton runat="server" ID="lbIncrementYear" CommandName="IncrementYear" CommandArgument='<%# Eval("ProductID") %>' Text="Add Year" />
</ItemTemplate>
<SeparatorTemplate><br /><br /></SeparatorTemplate>
</asp:DataList>
<asp:SqlDataSource ID="dsCurrentCmte" runat="server"
ConnectionString=""
ProviderName="System.Data.SqlClient" SelectCommand="spCmteList" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="txtID" Name="ID" PropertyName="Text" Type="String" DefaultValue="" />
</SelectParameters>
</asp:SqlDataSource>
</ItemTemplate>
</asp:TemplateField>
</Columns>
Two options:
Option 1
Specify the ItemCommand event handler for the DataList and use that to respond to the event:
<asp:DataList OnItemCommand="Item_Command" />
Then specify that function in the code behind:
Sub Item_Command(sender As Object, e As DataListCommandEventArgs)
If e.CommandName = "IncrementYear" Then
...
End If
End Sub
Option 2 Specify the OnClick eventhandler for the link button
<asp:LinkButton OnClick="LinkButton_Click" runat="server"/>
Then
Sub LinkButton_Click(sender As Object, e As EventArgs)
...
End Sub