Wrong index selected.

7 posts, 1 answers
  1. Pierre
    Pierre avatar
    56 posts
    Member since:
    Jun 2016

    Posted 24 Jun Link to this post

    01. protected void RDDL_Statut_Load(object sender, EventArgs e)
    02.{
    03.    DC_FiltragesDataContext Mydb = new DC_FiltragesDataContext();
    04.    var results = (from U in Mydb.PLOP
    05.                   select new { statut = U.STATUT}).Distinct();
    06. 
    07.    RDDL_Statut.DataSource = results;
    08.    RDDL_Statut.DataTextField = "statut";
    09.    RDDL_Statut.DataValueField = "statut";
    10. 
    11.    RDDL_Statut.DataBind();
    12.    RDDL_Statut.Items.Insert(0, new DropDownListItem("--ALL STATUT--", "ALL"));
    13. 
    14.}

                Hi, I have an issue with my drop down list.

    Lets say that i have a DropDownList Displaying : A, B ,C , D etc. And I need a default item.
    Using this code , my data is not correctly bound.
    The display of the DrowDownList Is the one i expected . But my "RDDL_Statut.SelectedItem.Value.ToString()" Is returning the Next Index.
    When A is clicked I get B value.


  2. Ivan Danchev
    Admin
    Ivan Danchev avatar
    829 posts

    Posted 29 Jun Link to this post

    Hello Pierre,

    Which event handler do you access the SelectedItem.Value property in? If you want to get the selected item's value I would suggest subscribing to the SelectedIndexChanged event and in its handler you can use the arguments to get it: e.Value.

    Regards,
    Ivan Danchev
    Telerik
    Do you need help with upgrading your ASP.NET AJAX, WPF or WinForms projects? Check the Telerik API Analyzer and share your thoughts.
  3. UI for ASP.NET Ajax is Ready for VS 2017
  4. Pierre
    Pierre avatar
    56 posts
    Member since:
    Jun 2016

    Posted 30 Jun in reply to Ivan Danchev Link to this post

    Hi,

    I'm using the SelectedIndexChanged with my

    protected void RDDL_Phase_ItemSelected(object sender, DropDownListEventArgs e)
    { RG_ProduitEC.Rebind(); }

    to rebind my RadGrid.
    On Selecting of my LinqDataSource I Check All my Dropdownlist With

    if (RDDL_Statut.SelectedItem !=null && RDDL_Statut.SelectedItem.Value.ToString() != "ALL")
      results=results.Where(s => s.XXX.Equals(RDDL_Statut.SelectedItem.Value.ToString() )) ;
    }

  5. Ivan Danchev
    Admin
    Ivan Danchev avatar
    829 posts

    Posted 04 Jul Link to this post

    Hello Pierre,

    The provided information is not enough for us to be able to determine what causes the behavior you have experienced. I would suggest isolating the DropDownList in a sample runnable project, which reproduces the issue, open a support ticket and attach it for further review. Here are our guidelines, which describe the correct approach for isolating an issue.

    Regards,
    Ivan Danchev
    Telerik
    Do you need help with upgrading your ASP.NET AJAX, WPF or WinForms projects? Check the Telerik API Analyzer and share your thoughts.
  6. Pierre
    Pierre avatar
    56 posts
    Member since:
    Jun 2016

    Posted 08 Jul Link to this post

    Hi,
    Let me help you reproduce this behavior.
    First in the aspx :

    <telerik:RadDropDownList ID="RDDL_Phase" runat="server" Skin="Vista" DataTextField="text" DataValueField="value" OnLoad="RDDL_Phase_Load" OnSelectedIndexChanged="RDDL_Phase_SelectedIndexChanged"  AutoPostBack="true" >
    </telerik:RadDropDownList>
    <h2><telerik:RadLabel runat="server" ID="Yeah" Text="HERE IS MA VALUE"></telerik:RadLabel></h2>

     

    Then in the code behind:

    01.public DataTable Get_RDDL_lorenipsum()
    02.{
    03.    DataTable data = new DataTable();
    04.    data.Columns.Add("ID"); data.Columns.Add("Name");
    05. 
    06.    List<string> Value = new List<string>() { "AA", "BB", "CC", "DD", "EE", "FF", "GG", "HH", "II", "JJ" };
    07.    foreach (var item in Value)
    08.    {
    09.        data.Rows.Add(item, item);
    10.    }
    11.    return data;
    12.}
    13. 
    14.protected void RDDL_Phase_Load(object sender, EventArgs e)
    15.{
    16.    RDDL_Phase.DataSource = this.Get_RDDL_lorenipsum();
    17.    RDDL_Phase.DataTextField = "Name";
    18.    RDDL_Phase.DataValueField = "ID";
    19.    RDDL_Phase.DataBind();
    20.    RDDL_Phase.Items.Insert(0, new DropDownListItem("--GOO GOO GOO--", "ALL"));
    21.}
    22.protected void RDDL_Phase_SelectedIndexChanged(object sender, DropDownListEventArgs e)
    23.{
    24.    this.Yeah.Text = e.Value;
    25.}

    Voila !

    Btw, i never had so mutch issue posting on a forum .. The backspace refresh and the blockcode Eternal trap re fun to see.

  7. Pierre
    Pierre avatar
    56 posts
    Member since:
    Jun 2016

    Posted 08 Jul in reply to Pierre Link to this post

    The only way I see to fix this is to had a row to a specific index in a datatable.
    But the ordering of a datatable is based on the sorting..
    So the only way to workaround is to a dummy column in the datatable n filter on it.

    this is a lot of work around when Dropdown list . Items .insert should have done it.

    If there is any other solution please let me know. For now the Drop Down list have been removed.

  8. Answer
    Ivan Danchev
    Admin
    Ivan Danchev avatar
    829 posts

    Posted 08 Jul Link to this post

    Hello Pierre,

    Thank you for posting a sample runnable page.

    After analyzing the code we can say that the issue is caused by rebinding the DropDownList on every postback in the RDDL_Phase_Load handler. What happens is the following:
    • after a selection is made, the control initiates a postback sending the info about the SelectedIndex to the server, so for example if you select CC the SelectedIndex is 3.
    • on the server the  RDDL_Phase_Load handler is reached and you rebind the control which means after you call RDDL_Phase.DataBind(); the control contains one item less (the previously added --GOO GOO GOO-- item at this point does not exist in the items collection) so now the index 3 points at a different item (DD).
    If you need to rebind the DropDownList on every postback, i.e. if binding it only on initial postback:
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            RDDL_Phase.DataSource = Get_RDDL_lorenipsum();
            RDDL_Phase.DataTextField = "Name";
            RDDL_Phase.DataValueField = "ID";
            RDDL_Phase.DataBind();
            RDDL_Phase.Items.Insert(0, new DropDownListItem("--GOO GOO GOO--", "ALL"));
        }
    }

    is not an option and you must use the control's OnLoad event and rebind it on every postback, I would suggest adding logic to the RDDL_Phase_Load handler for correcting the SelectedIndex when an item is added, for example:
    protected void RDDL_Phase_Load(object sender, EventArgs e)
    {
        RDDL_Phase.DataSource = this.Get_RDDL_lorenipsum();
        RDDL_Phase.DataTextField = "Name";
        RDDL_Phase.DataValueField = "ID";
        RDDL_Phase.DataBind();
        RDDL_Phase.Items.Insert(0, new DropDownListItem("--GOO GOO GOO--", "ALL"));
        RDDL_Phase.SelectedIndex = RDDL_Phase.SelectedIndex - 1;
    }


    Regards,
    Ivan Danchev
    Telerik by Progress
    Do you need help with upgrading your ASP.NET AJAX, WPF or WinForms projects? Check the Telerik API Analyzer and share your thoughts.
Back to Top
UI for ASP.NET Ajax is Ready for VS 2017