Hi Brett,
Glad to know this issue has been solved. If you need further assistance,
please don't hesitate to let me know.
Regards,
Allen Chen
Microsoft Online Support
--------------------
| From: "Brett" <
[email protected]>
| References: <
[email protected]>
<
[email protected]>
<#
[email protected]>
| Subject: Re: DropDownList has SelectedValue which in invalid
| Date: Mon, 22 Sep 2008 13:23:49 -0400
| Lines: 316
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.3138
| X-RFC2646: Format=Flowed; Original
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198
| Message-ID: <
[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.aspnet
| NNTP-Posting-Host: dsl-1-210.d01.scpnbh.pbtcomm.net 64.53.27.210
| Path: TK2MSFTNGHUB02.phx.gbl!TK2MSFTNGP01.phx.gbl!TK2MSFTNGP04.phx.gbl
| Xref: TK2MSFTNGHUB02.phx.gbl
microsoft.public.dotnet.framework.aspnet:76534
| X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
|
| I believe I have found a solution by inserting the missing DropDownList
item
| from the FormView's ItemCreated event procedure. This inserts the item
| before the databound items are appended. So, to prevent duplicates, I
have
| to make sure not to add any items that will be appended after databind.
| The code is below. This may not be the most efficient way to do things,
| but it is one way. Alternatively, I could remove two-way databinding
| and populate the entire ddl itemlist in code.
|
| Just a note: I also tried inserting the item in the DataBound event, but
| this occurs too late, resulting in the invalid SelectedValue error.
|
| Code in aspx.vb:
| Protected Sub FormView1_ItemCreated(ByVal sender As Object, ByVal e As
| System.EventArgs) Handles FormView1.ItemCreated
|
| If FormView1.CurrentMode = FormViewMode.Edit Then
| Dim rowView As DataRowView = CType(FormView1.DataItem, DataRowView)
| Dim ddl1 As DropDownList =
CType(FormView1.FindControl("ddlAssignedTo"),
| DropDownList)
|
| If Not IsNothing(rowView) Then
| 'Fill a string with a list of active items
| Dim args As New DataSourceSelectArguments
| ItemSqlDataSource.DataSourceMode = SqlDataSourceMode.DataSet
| Dim view As DataView = ItemSqlDataSource.Select(args)
| Dim table As DataTable = view.ToTable
| Dim sActiveItems As String = ""
| For Each dr As DataRow In table.Rows
| sActiveItems = sActiveItems & dr.ItemArray(0).ToString & "|"
| Next
|
| 'If the record was originally saved with an item that is no longer
| 'active, add it to the ddl and make it the selected item
| If Not (sActiveItems.Contains(rowView("ResolvedBy"))) Then
| ddl1.Items.Add(rowView("ResolvedBy").ToString())
| ddl1.SelectedValue = rowView("ResolvedBy").ToString()
| End If
| End If
| End If
| End Sub
|
|
|
|
| | > Allen,
| >
| > Thank you for your response. The DropDownList is bound to the field in
| > its
| > definition, so the error occurs as soon as I load the page. I have
| > included
| > some code below to illustrate.
| >
| > aspx:
| > <asp:SqlDataSource ID="TechnicianSqlDataSource" runat="server"
| > ConnectionString="<%$ ConnectionStrings:SSR_ConnString %>"
| > DataSourceMode="DataReader"
| > SelectCommand="SELECT [Name] FROM [Technician] WHERE ([Active] = 1)
ORDER
| > BY Indx">
| > </asp:SqlDataSource>
| >
| > <asp
ropDownList ID="ddlAssignedTo" runat="server"
| > DataSourceID="TechnicianSQLDataSource"
| > DataTextField="Name"
| > DataValueField="Name"
| > SelectedValue='<%# Bind("ResolvedBy") %>'
| > AppendDataBoundItems="True">
| > <asp:ListItem Selected="True"> </asp:ListItem>
| > </asp
ropDownList>
| >
| > aspx.vb:
| > Protected Sub Page_Load(ByVal sender As Object, ByVal e As
| > System.EventArgs) Handles Me.Load
| >
| > If My.User.IsInRole(Domain & "\Maint_Full") Then
| > FormView1.DefaultMode = FormViewMode.Edit
| > Else
| > FormView1.DefaultMode = FormViewMode.ReadOnly
| > End If
| >
| > 'I tried the following code in the PreRender event, but the error
| > 'occurred before PreRender. So, I moved it to Page_Load,
| > 'but I still get the "SelectedValue invalid" error when ddl1 is
| > 'declared below.
| > If FormView1.CurrentMode = FormViewMode.Edit Then
| > Dim rowView As DataRowView = CType(FormView1.DataItem, DataRowView)
| > Dim ddl1 As DropDownList =
| > CType(FormView1.FindControl("ddlAssignedTo"), DropDownList)
| > If Not IsNothing(rowView) AndAlso Not
| > IsNothing(ddl1.Items.FindByValue(rowView("ResolvedBy").ToString())) Then
| > ddl1.SelectedValue = rowView("ResolvedBy").ToString()
| > Else
| > ddl1.Items.Add(rowView("ResolvedBy").ToString())
| > ddl1.SelectedValue = rowView("ResolvedBy").ToString()
| > End If
| > End If
| >
| > If FormView1.CurrentMode = FormViewMode.Edit Then
| > FormView1.FindControl("ddlAssignedTo").Focus()
| > End If
| > End Sub
| >
| >
| > Thanks again,
| > Brett
| >
| >
| > | >> Hi Brett,
| >>
| >> From your description you want to avoid getting the exception:
| >> 'ddlAssignedTo' has a SelectedValue which is invalid because it does
not
| >> exist in the list of items.
| >>
| >> Is my understanding correct?
| >>
| >> If so you don't have to add an extra field in the data base. This
| >> exception
| >> is generally caused by binding the DropDownList on every postback. To
| >> demonstrate how this exception will be thrown I've created a demo:
| >>
| >> aspx.cs
| >> public partial class _Default : System.Web.UI.Page
| >> {
| >> protected void Page_Load(object sender, EventArgs e)
| >> {
| >> //Uncomment following code to reproduce this exception
| >> // this.DropDownList1.DataBind();
| >> }
| >>
| >> protected void Button1_Click(object sender, EventArgs e)
| >> {
| >> this.DropDownList1.SelectedValue = this.TextBox1.Text;
| >> }
| >> }
| >> aspx:
| >> <asp:SqlDataSource ID="SqlDataSource1" runat="server"
| >> ConnectionString="<%$ ConnectionStrings:AConnectionString
%>"
| >> SelectCommand="SELECT * FROM [Table_1]"></asp:SqlDataSource>
| >>
| >> <asp
ropDownList ID="DropDownList1" runat="server"
| >> DataSourceID="SqlDataSource1" DataTextField="theID"
| >> DataValueField="theID">
| >> </asp
ropDownList>
| >>
| >> <asp:Button ID="Button1" runat="server" onclick="Button1_Click"
| >> style="height: 26px" Text="Button" />
| >> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
| >>
| >> To reproduce please try following steps:
| >> 1. View the page and enter an item of the DropDownList in the TextBox.
| >> 2. Delete the record in the data base where the above item resides.
| >> 3. Click the button to post back.
| >>
| >> Initially there's no exception. If you uncomment the code in the
| >> Page_Load
| >> event handler the exception will be thrown.
| >>
| >> So if we want to eliminate this exception, we should check if we bind
the
| >> DropDownList on every postback. If it's done in code behind, following
| >> code
| >> may always help:
| >>
| >> if(!IsPostBack)
| >> {
| >> //Bind DropDownList
| >> }
| >>
| >> If binding the DropDownList on every postback is a must in the
| >> requirement
| >> I think we can do some check before setting the selected value of the
| >> DropDownList.
| >>
| >> As to your following concerns:
| >> ==================================================
| >> So, is there a way to either
| >>
| >> a) Allow entries into a DropDownList that are not in the databound
| >> table
| >> (like a VB ComboBox), or
| >>
| >> b) Add the missing value to the DropDownList items after it is bound
| >> to
| >> the table?
| >> ==================================================
| >>
| >> We can add an item in the PreRender event handler of the DropDownList
| >> control. Something like:
| >> void DropDownList1_PreRender(object sender, EventArgs e)
| >> {
| >> DropDownList ddl = (DropDownList)sender;
| >> ddl.Items.Insert(0, new ListItem("hello", "world"));
| >> }
| >>
| >> If this problem isn't got solved please send me a demo project that can
| >> help me understand your scenario better.
| >>
| >> Regards,
| >> Allen Chen
| >> Microsoft Online Support
| >>
| >> Delighting our customers is our #1 priority. We welcome your comments
and
| >> suggestions about how we can improve the support we provide to you.
| >> Please
| >> feel free to let my manager know what you think of the level of service
| >> provided. You can send feedback directly to my manager at:
| >> (e-mail address removed).
| >>
| >> ==================================================
| >> Get notification to my posts through email? Please refer to
| >>
http://msdn.microsoft.com/en-us/subscriptions/aa948868.aspx#notifications.
| >>
| >> Note: The MSDN Managed Newsgroup support offering is for non-urgent
| >> issues
| >> where an initial response from the community or a Microsoft Support
| >> Engineer within 1 business day is acceptable. Please note that each
| >> follow
| >> up response may take approximately 2 business days as the support
| >> professional working with you may need further investigation to reach
the
| >> most efficient resolution. The offering is not appropriate for
situations
| >> that require urgent, real-time or phone-based interactions or complex
| >> project analysis and dump analysis issues. Issues of this nature are
best
| >> handled working with a dedicated Microsoft Support Engineer by
contacting
| >> Microsoft Customer Support Services (CSS) at
| >>
http://support.microsoft.com/select/default.aspx?target=assistance&ln=en-us.
| >> ==================================================
| >> This posting is provided "AS IS" with no warranties, and confers no
| >> rights.
| >>
| >> --------------------
| >> | From: "Brett" <
[email protected]>
| >> | Subject: DropDownList has SelectedValue which in invalid
| >> | Date: Fri, 19 Sep 2008 17:42:02 -0400
| >> | Lines: 38
| >> | X-Priority: 3
| >> | X-MSMail-Priority: Normal
| >> | X-Newsreader: Microsoft Outlook Express 6.00.2900.3138
| >> | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198
| >> | X-RFC2646: Format=Flowed; Original
| >> | Message-ID: <
[email protected]>
| >> | Newsgroups: microsoft.public.dotnet.framework.aspnet
| >> | NNTP-Posting-Host: dsl-1-210.d01.scpnbh.pbtcomm.net 64.53.27.210
| >> | Path:
TK2MSFTNGHUB02.phx.gbl!TK2MSFTNGP01.phx.gbl!TK2MSFTNGP02.phx.gbl
| >> | Xref: TK2MSFTNGHUB02.phx.gbl
| >> microsoft.public.dotnet.framework.aspnet:76417
| >> | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
| >> |
| >> | I have a DropDownList in an ASP.NET web form that is populated with
| >> items
| >> | from a lookup table by binding that DropDownList to a SqlDataSource.
| >> | However, the items in the lookup table can change over time. The
| >> problem
| >> is
| >> | that when an item has been removed from the lookup table, and a user
| >> wants
| >> | to retrieve a record that used the deleted item, the following error
| >> occurs:
| >> |
| >> |
| >> |
| >> | 'ddlAssignedTo' has a SelectedValue which is invalid because it does
| >> not
| >> | exist in the list of items.
| >> |
| >> |
| >> |
| >> | I need to allow the lookup table items to change, while still
allowing
| >> | retrieval of old records that used the now deleted items. I could
add
| >> a
| >> | field to the lookup table indicating whether an item is active or
| >> inactive,
| >> | but only the active ones (and the selected one) should appear in the
| >> | DropDownList.
| >> |
| >> |
| >> |
| >> | So, is there a way to either
| >> |
| >> | a) Allow entries into a DropDownList that are not in the databound
| >> table
| >> | (like a VB ComboBox), or
| >> |
| >> | b) Add the missing value to the DropDownList items after it is
bound
| >> to
| >> | the table?
| >> |
| >> |
| >> |
| >> |
| >> |
| >> | Thanks,
| >> |
| >> | Brett
| >> |
| >> |
| >> |
| >>
| >
| >
| >
| >
| >
| >
| >
| >
| >
| >
|
|
|
|
|
|
|
|