Hi all,

I'm relatively new to ASP.NET - used to code in Coldfusion.
I've got this control created in a page <asp:listbox>.
I also have a javascript function in the same page to add listitems into the listbox on certain client calls such as the following:-

var anOption = document.createElement("OPTION");
obj.add(anOption); 
anOption.text = "foo";
anOption.value = "1";

I am sure that the items are added into the listbox as I can see it on the front end. Okay the problem is, when I trigger a function call in the vb language, I get listbox1.Items.Count = 0. It should be 1 there. So I'd like to find out from fellow ASP.NET developers if the asp's server control will take note of the listitems updated via javascript.

Thanks in advance. ;)

Recommended Answers

All 12 Replies

I might be able to help you with the .Net side, but I am not as good as you with the javascript. Can you paste the rest of the javascript that adds the option to the listbox?

Hey kev, thanks in advance.
Here's the function in javascript:-

function addOptionToListBox(lsVal, lsNam, obj) {
            var anOption = document.createElement("OPTION");
            obj.add(anOption);
            anOption.text = lsNam; 
            anOption.value = lsVal;
        }

Then onclick of a button, I am trying to get the value of listbox1.Items.Count in vb.

sorry, I still can't get it to even add the option on the client side. Can you post the whole page?

Elements you add via JavaScript have nothing to do with Objects created in ASP.NET. Given the client-server nature of the web, surely you can see why this is the case.

Server Objects (ASP.NET "Web Controls") exist only on the server. When done processing, the ViewState object is created and embedded within the response stream as a hidden form variable. This is the mechanism by which Web Controls are recreated and restored to their state on PostBack.

Since your JavaScript is creating client elements, and not adding them to the ViewState variable, there is no way your server-side control can create corresponding Web Controls on postback.

What you need to do:

Server-side, you can iterate through the Request object to retrieve posted form values, including any options etc. you created client-side.

OR

Create all your controls server-side.

right, that (option a) was what I was going for. Wanted to give him some sample code but couldn't get the javascript part working

Thanks a lot kev and tgreer. I'll try out the first option suggested and come back with a feedback ;)

can you post the rest of the aspx page? I can't get it to work and now you have me hooked on making it work?

Err, it's kinda difficult eh kev.
But here goes:-

File1.aspx:-

<asp:ListBox ID="Groups" runat="server" SelectionMode="multiple" width="250"/>
<script type="text/javascript">        
        function getCustomerList(custIDList, custNameList){
            var lbClients = document.getElementById("<%=Clients.ClientID %>");
            var lbHidden = document.getElementById("<%=hdnClientID.ClientID %>");
            var lsValue = custIDList.split(",");
            var lsName = custNameList.split(",");
            var cnt = 0;
            var s = lbHidden.value;
            for(var i=0; i<lsValue.length; i++) {
                cnt = 0;
                for(var j=0; j<lbClients.options.length; j++) {                                  
                    if(lbClients.options[j].value != lsValue[i])
                        cnt++;
                }
                if(cnt == lbClients.options.length) {
                    addOptionToListBox(lsValue[i], lsName[i], lbClients);
                    if (s.length > 0)
                        s = s + ",";
                    s = s + lsValue[i];
                }
            }    
            lbHidden.value = s; 
        }
function addOptionToListBox(lsVal, lsNam, obj) {
            var anOption = document.createElement("OPTION");
            obj.add(anOption);
            anOption.text = lsNam; 
            anOption.value = lsVal;            
        }
</script>

File2.aspx (VB code):-

strScript = "@SCRIPT>window.opener.getCustomerList('" & strValue.ToString() & "', '" & strName.ToString() & "'); window.close(); window.opener.focus();@/SCRIPT>"
        ClientScript.RegisterClientScriptBlock(Page.GetType(), "CloseChild", strScript.Replace("@", "<"))

Btw, I could not use any of your suggested options, tgreer.
[1] Could not use Request.Form because it's a multiple selection in the listbox.
If I am to programatically do .select() on the listitems in the listbox after adding them it, it would then look kinda ugly lol.
So I opted to add a hidden field instead - by storing a comma separated list of the customer IDs.

All form values are submitted back to the server, so all form values are in the Request object, multi-select or not.

Of course, the canonical way to do this in ASP.NET is to populate your controls server-side, even if this means adding server round-trips to your logic.

Glad you got it working, but I predict you're going to have a real struggle with ASP.NET!

Yup definitely tgreer.
I'm sure I'll be back with more problems lol.
But thanks for the prompt replies ;)

Thanks for the gracious answer... I thought my last post came across too strong. My point was, ASP.NET is a profoundly different web development methodology (profoundly flawed, in my opinion).

Thus web developers who understand the client-server nature of the web, the stateless environment, etc. who then try to switch to ASP.NET, which "pretends" that you're developing on a fat client with state, will have a very difficult time.

We get tripped on on KNOWING how the web works, what the client does with scripts, cookies, and the retinue of HTML Form elements and CSS. ASP.NET hides all of that from the developer, so we end up fighting it all the way. Your scenario was a perfect example: you wanted to create some HTML elements, client-side, with JavaScript. You then wanted to get those values, server-side. Simple, in ASP or PHP - mind-numbingly awkward in ASP.NET.

commented: :) +4

Thanks for the gracious answer... I thought my last post came across too strong.

Nah... tend to learn better with truthful words ;)

Btw, yup what you said is true. I used to be a Coldfusion developer, am still one. The reason I've got to move on to ASP.net for this particular project is because ASP.net is free. I got to have this program deployed client-site and they will use it locally. So I could not use CF in any circumstances :(

I'm so used to CF that I'm starting to miss it while developing in ASP.net lol.
Thanks again tgreer ;)
Will be checking frequently on the board hoping to learn as much as possible :D

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.