We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

datalist, EditItemTemplate problem

csetzkorn
csetzkorn asked
on
Medium Priority
543 Views
Last Modified: 2012-05-05
Hi,

I have a datalist with a dropdownlist (projects)

<asp:datalist …
      <ItemTemplate>
              …
      </ItemTemplate>

      <EditItemTemplate>

            …
            <asp:DropDownList ID = "projects" Runat="server" DataTextField="project_title" DataValueField="project_uid" AutoPostBack = "true" OnSelectedIndexChanged="ProjectSelectionChanged" ></asp:DropDownList>

            …

            <asp:ListBox …

      </EditItemTemplate>

I can capture changes of the dropdownlist ‘projects’ like this:

protected void ProjectSelectionChanged(object sender, EventArgs e)
{

}

I am just wondering whether it is possible to access, for example, a ListBox within the EditItemTemplates. Is it possible and how? Many thanks.

Chris
Comment
Watch Question

CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
Yes, you can use Item.FindControl(id) to find the ListBox, but the timing of this is critical, since you are changing modes.  I normally don't define an EditItemTemplate, but let them edit all the DataList items all the time.

Bob

Author

Commented:
Sure, I usually use something like this:

e.Item.FindControl("name")

But I cannot use it in ProjectSelectionChanged (see above). How can I access an item (a ListBox) from the ProjectSelectionChanged method? I know that the item must exist at this point in time, otherwise the method could not have been invoked

Ta

Chris
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
The DropDownList has a SelectedIndex property to get the corresponding item from the DataList.

Bob

Author

Commented:
Sorry, but there must be a misunderstanding. I want to change a ListBox object depending on the current selection of the dropdownlist. I know how to access the selectedindex of the dropdownlist but I do not know how to access the LISTBOX OBJECT from within the ProjectSelectionChanged method (see orginal post).
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
Ok, maybe I am misunderstanding.  If you have the DataList item, and you use item.FindControl("ListBox1"), you can get a reference to the ListBox control.

Bob

Author

Commented:
the problem is I cannot use item.FindControl("ListBox1") in the ProjectSelectionChanged method
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
Why not?

Bob

Author

Commented:
coz i don't receive DataListItemEventArgs but plain EventArgs from the dropdownlist.
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
Let's try this VB.NET example:

Dim item As DataListItem = Me.DataList1.Items(Me.projects.SelectedIndex)
Dim lb As ListBox = item.FindControl("ListBox1")

Bob

Author

Commented:
sorry, i don't get it. What's 'me'? Is it 'this' in C#?

also, to access my dropdownlist i would have to use something like this:

((DropDownList)sender).SelectedValue

in the ProjectSelectionChanged method. i cannot access the dropdownlist directly as you suggest.
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
That's where it helps to indicate language, .NET framework, etc.  

This is untested code:

DropDownList ddlProjects = (DropDownList)sender;
DataListItem item = this.DataList1.Items[ddlProjects.SelectedIndex];
ListBox lb = item.FindControl("ListBox1");

Bob

Author

Commented:
I am sorry but why should the SelectedIndex of a dropdownlist give me access to my <asp:ListBox object (see original code)?

Still I have tried your code (you never know):

DropDownList ddlProjects = (DropDownList)sender;
DataListItem item = this.table_details_datalist.Items[ddlProjects.SelectedIndex];
ListBox lb = (ListBox) item.FindControl("tables_left");

It produces an exception ...

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Source Error:


Line 419:
Line 420:        DropDownList ddlProjects = (DropDownList)sender;
Line 421:        DataListItem item = this.table_details_datalist.Items[ddlProjects.SelectedIndex];
Line 422:        ListBox lb = (ListBox) item.FindControl("tables_left");
Line 423:
 
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
Yep, you're right, and now I can see the bigger picture.  You need to determine which DataListItem the DropDownList is bound to.  You might be able to do that with a foreach and the UniqueID of the control.

Bob

Author

Commented:
The DropDownList and ListBox are 'independent'. When the DropDownList is changed, the ListBox is reinitialised wit values from the database (depending on the SelectedValue in the DropDownList).

An idea I have is to put the ListBox in a Session object in the Item_Created method. I could then access the ListBox from within the ProjectSelectionChanged method. What do you think?
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
I think that I would like to see that happen, because I don't think that will work.

Bob

Author

Commented:
Ok you are right. I cannot make the ListBox persistent. I also believe now that it is impossible to access it from within the ProjectSelectionChanged method.

Chris
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
This is what I was talking about:

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlSender = (DropDownList)sender;
        foreach (DataListItem item in this.DataList1)
        {
            DropDownList ddl = item.FindControl();
            if (ddl.UniqueID == ddlSender.UniqueID)
            {
                ListBox lb = item.FindControl("ListBox1");
                // Do something with the ListBox.
                break;
            }
        }
    }

Bob

Author

Commented:
this doesn't work (I tried it before).

(1) foreach does not work because System.Web.UI.WebControls.DataList does not contain a public definition for GetEnumerator

this would work:

for (int c = 0; c < this.table_details_datalist.Items.Count; c++ )
{

}

but there is only one item - the dropdownlist. I cannot access the ListBox as you suggest.

C
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008

Commented:
.NET version?  2.0 or 1.1?

Bob

Author

Commented:
2.0
CERTIFIED EXPERT
Most Valuable Expert 2012
Top Expert 2008
Commented:
Try this (replacing DropDownList and Listbox1 with IDs for the controls--I left out some things before:

   protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlSender = (DropDownList)sender;
        foreach (DataListItem item in this.DataList1.Items)
        {
            DropDownList ddl = (DropDownList)item.FindControl("DropDownList1");
            if (ddl.UniqueID == ddlSender.UniqueID)
            {
                ListBox lb = (ListBox)item.FindControl("ListBox1");
                // Do something with the ListBox.
                break;
            }
        }
    }

Bob

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts

Author

Commented:
thanks this works!
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.