Welcome Guest Search | Active Topics | Sign In | Register

Callback Panel Options
paul
Posted: Thursday, June 21, 2007 4:54:25 AM
Rank: Member
Groups: Member

Joined: 6/21/2007
Posts: 15
Ok I know this is going to sound strange but here goes.

I am using a callback panel with four drop downs.
We are doing a Country, State/Prov, City, Zip/Postal lookup from SQL Server.

When the user selects the country it populates the State/Prov.
Then the user selects the State/Prov and it populates the city.
Right down the list until we finish with the zip/postal code.

I have a panel setup to let the user know when it is loading and it disables all controls on the panel
when each dropdown is loading.

Ok now for my problem. Certain times when a dropdown is selected there is a long delay (more than 5 to 10 secs) before it notifies the user that it is loading. It does not happen all the time. I have tested it without the callback panel just doing postbacks and it works fine with no delay.

If you could maybe shed some light on this problem I would appreciate it.
eo_support
Posted: Thursday, June 21, 2007 5:05:34 AM
Rank: Administration
Groups: Administration

Joined: 5/27/2007
Posts: 24,193
Hi Paul,

Check your view state data size. Most of the time, when the CallbackPanel "chokes", it "chokes" on view state. CallbackPanel performance can benefit if you can dramatically reduce view state size.

If that does not solve the problem, we would need you to create a sample application that duplicates the problem so that we can look into it at here and see if we can get to the bottom of it.

Thanks
paul
Posted: Thursday, June 21, 2007 5:17:29 AM
Rank: Member
Groups: Member

Joined: 6/21/2007
Posts: 15
Ok to see an example of this problem go to url [removed for privacy]
Please note: You must play with it for a while before you will see the problem. Really weird.
eo_support
Posted: Thursday, June 21, 2007 5:24:22 AM
Rank: Administration
Groups: Administration

Joined: 5/27/2007
Posts: 24,193
I looked the page and the view state data is HUGE. You definitely will want to reduce it. Try to:

1. Set the combobox's EnableViewState to false;
2. Re-populate the combobox every time, for example, if your previous code is:

Code: C#
private void Page_Load(object sender, EventArgs e)
{
   if (!Page.PostBack)
       FillCountryList();
}


Change it to:
Code: C#
private void Page_Load(object sender, EventArgs e)
{
    FillCountryList();
}
paul
Posted: Thursday, June 21, 2007 5:32:18 AM
Rank: Member
Groups: Member

Joined: 6/21/2007
Posts: 15
The problem with that approach is that it will not keep the users last selection. So when the list repopulates it wipes out all the other selections.

Here is the code used to populate the dropdowns. Sorry for the formating issues.

Imports System.Data.sqlclient
Partial Class firstfields
Inherits System.Web.UI.UserControl
Protected Sub state_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles state.SelectedIndexChanged
Dim sqltemp As String = ""
Dim myreader As SqlDataReader
sqltemp = "select distinct city from city with (nolock) where state='" + fixstring(state.SelectedValue) + "' order by city"
Response.Write(sqltemp)
city.Items.Clear()
myreader = runsqlquery(sqltemp)
While myreader.Read
city.Items.Add(myreader.Item("city"))
End While
myreader.Close()
End Sub
Protected Sub country_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles country.SelectedIndexChanged
Dim sqltemp As String = ""
Dim myreader As SqlDataReader
sqltemp = "select distinct stateprov from states with (nolock) where country='" + fixstring(country.SelectedValue) + "'"
state.Items.Clear()
myreader = runsqlquery(sqltemp)
While myreader.Read
state.Items.Add(myreader.Item("stateprov"))
End While
myreader.Close()
sqltemp = "select distinct city from city with (nolock) where state='" + fixstring(state.SelectedValue) + "' order by city"
city.Items.Clear()
myreader = runsqlquery(sqltemp)
While myreader.Read
city.Items.Add(myreader.Item("city"))
End While
myreader.Close()
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sqltemp As String = ""
Dim myreader As SqlDataReader
'meme.Visible = False
sqltemp = "select * from countrytbl with (nolock) order by country"
If Not IsPostBack Then
myreader = runsqlquery(sqltemp)
While myreader.Read()
country.Items.Add(myreader.Item("country"))
End While
country.SelectedValue = "United States"
myreader.Close()
sqltemp = "select stateprov from states with (nolock) where country='United States' order by stateprov"
myreader = runsqlquery(sqltemp)
While myreader.Read()
state.Items.Add(myreader.Item("stateprov"))
End While
myreader.Close()
sqltemp = "select distinct city from city with (nolock) where state='AK'"
myreader = runsqlquery(sqltemp)
While myreader.Read()
city.Items.Add(myreader.Item("city"))
End While
myreader.Close()
End If
End Sub
End Class
eo_support
Posted: Thursday, June 21, 2007 5:41:14 AM
Rank: Administration
Groups: Administration

Joined: 5/27/2007
Posts: 24,193
Hi Paul,

Do the populating in Page_Init instead of Page_Load. That should help you to keep user selection.

Thanks
paul
Posted: Thursday, June 21, 2007 5:43:17 AM
Rank: Member
Groups: Member

Joined: 6/21/2007
Posts: 15
I just changed the code to load on the INIT rather than the page load. I also disabled the viewstate on all the dropdowns. The problem is still happening and it does not look like a view state issue because the view state is really small. Have a look for yourself.
eo_support
Posted: Thursday, June 21, 2007 5:55:39 AM
Rank: Administration
Groups: Administration

Joined: 5/27/2007
Posts: 24,193
I need your link again. Can you PM to me? Sorry that I didn't keep it.
paul
Posted: Thursday, June 21, 2007 6:11:27 AM
Rank: Member
Groups: Member

Joined: 6/21/2007
Posts: 15
I PM'ed it to you. Let me know if you did not get it.
eo_support
Posted: Thursday, June 21, 2007 6:15:11 AM
Rank: Administration
Groups: Administration

Joined: 5/27/2007
Posts: 24,193
I looked into your code and noticed that it slowed not after you made a few selection, but slowed after you selected certain counties. Try select "Argentina" and then select another country, you will see it choke immediately.

We debugged the code and found that you've populated 3114 cities to the city drop down for "Buenos Aires" in "Argentina". That huge number of cities is causing it to choke up.
paul
Posted: Thursday, June 21, 2007 6:19:41 AM
Rank: Member
Groups: Member

Joined: 6/21/2007
Posts: 15
I see your point but I do not have a work around for that. If the control notified the user immediately it would not be and issue because it would say loading... and the user would know they had to wait. But what is happening is it just seems to hang with no indication that something is happening until it finishes. Any idea's?
eo_support
Posted: Thursday, June 21, 2007 6:39:36 AM
Rank: Administration
Groups: Administration

Joined: 5/27/2007
Posts: 24,193
Given the size of your data I do not think there is a simple solution to this. Our CallbackPanel code actually displays the loading message right after you changed the selection, but IE doesn't update the screen for a long time because its too busy counting the cities.

Complicated solution is possible but having user to pick one out of 3114 items from a listbox probablly won't work for the user anyway. So you may still want to tackle the problem from that front. If that is not an option, you can try this way:

1. Set the country listbox's AutoPostBack to false;
2. Attach a client side event handler to the listbox's onchange event, say the name is countryChanged;
3. Inside your onchange event, you will: a. Display status information, b. Set a timer to call another function to triger the callback.

The final code will be something like this:

Code: JavaScript
function countryChanged()
{
    var statusPanel = document.getElementById("statusPanel");
    statusPanel.innerHTML = "Loading";
    window.setTimeout("eo_Callback('Callback1')", 200);
}


The timer is important so that IE can get a "break" to actually refresh the screen to display the status message. You may need to delay it longer. However this introduces a gap in which user will still be able to make another selection, which is not what you wanted. If you want to prevent that, you can displays a modal dialog box using our dialog control instead of changing statusPanel.innerHTML.



paul
Posted: Thursday, June 21, 2007 6:46:31 AM
Rank: Member
Groups: Member

Joined: 6/21/2007
Posts: 15
Sounds like this approach may work for me. I am not so concerned about the user picking another selection as I am concerned that they are informed that the dropdown is loading and they need to wait. If they see a loading... indication they will probably not attempt to pick something else until it is complete. Even if they do it will not really matter. Once again your support has been outstanding and I thank you for the lightning speed of your reply.

I will let you know later today if this approach works for me.
eo_support
Posted: Thursday, June 21, 2007 7:00:55 AM
Rank: Administration
Groups: Administration

Joined: 5/27/2007
Posts: 24,193
Glad to hear that you like our support! We work very hard to offer both fast and accurate reponse. :)


You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.