Hi,
I have an ASP .NET page with codebehind in a vb file.
The page has a dropdown control, and a JS function which used HTTP XML
Request to get the data from the database, and populate the dropdown.
Actually, the JS creates the OPTION elements using th retrieved db data, and
adds them to the SELECT element using DOM objects.
The dropdown works ok, and the items are visible, but when the user clicks
"Save" button, and the page posts back to the server, in the VB codebehind,
the selected value in the dropdown is empty, and the items collection is
empty.
Why is this? How can I fix this behavior?
Thanks in advance,
Richard 4 1571
Hi Richard,
The problem is that ASP maintains state by using ViewState. When you
post back a page, controls are first instantiated, then initialized
with values from ViewState, and at the very end, the SaveViewState
event is called. The next time you post back, the values that were
saved in the SaveViewState event will again be used to repopulate the
controls on Initialization.
When you modify controls like Dropdowns through Javascript (modify as
in add members, not changing the selected index), the server cannot
possibly know about this.
In your case, I would suggest you use the internal __doPostBack
Javscript function. You can check out the source of any aspx page in
your browser, and will find it there:
function __doPostBack(eventTarget, eventArgument) {
....
}
You also need your page to implement IPostBackEventHandler to handle
the async postback. An example follows:
aspx page:
<%@ Page Language="C#" AutoEventWireup="True"
CodeBehind="Default.aspx.cs"
Inherits="ImplementIPostBackEventHandler._Default"
EnableViewState="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<script>
function populateListBox() {
var lst = document.getElementById('theListBox');
var postBackArg = new Array()
for(var i = 1;i <= 3;i++) {
var newOptionName = "element_" + i;
var newOptionValue = i;
var newOption = new Option(newOptionName,
newOptionValue);
lst.options.add(newOption);
postBackArg[i-1] = newOptionName + "," +
newOptionValue;
}
__doPostBack('<%= this.ClientID %>',
postBackArg.join(";"));
}
</script>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="theListBox" runat="server" />
<input id="btnTriggerJs" type="button" value="btnTriggerJs"
OnClick="populateListBox()" />
<asp:Button ID="btnPostBack" OnClick="btnPostBack_Click"
Text="btnPostBack" runat="server" />
</div>
</form>
</body>
</html>
codebehind file:
using System;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ImplementIPostBackEventHandler
{
public partial class _Default : System.Web.UI.Page,
IPostBackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnPostBack_Click(object sender, EventArgs e)
{
foreach(ListItem li in theListBox.Items)
{
/* ... */
}
}
public void RaisePostBackEvent(string eventArg)
{
string[] newElements = eventArg.Split(';');
foreach(string newElement in newElements)
{
string[] newElementArray = newElement.Split(',');
theListBox.Items.Add(new ListItem(newElementArray[0],
newElementArray[1]));
}
}
}
}
================
Regards,
Steve www.stkomp.com
Richard wrote:
Hi,
I have an ASP .NET page with codebehind in a vb file.
The page has a dropdown control, and a JS function which used HTTP XML
Request to get the data from the database, and populate the dropdown.
Actually, the JS creates the OPTION elements using th retrieved db data, and
adds them to the SELECT element using DOM objects.
The dropdown works ok, and the items are visible, but when the user clicks
"Save" button, and the page posts back to the server, in the VB codebehind,
the selected value in the dropdown is empty, and the items collection is
empty.
Why is this? How can I fix this behavior?
Thanks in advance,
Richard
Thanks Steve, great explanation.
It'd be nice in JS to have a function to add objects to the viewstate ;-)
As I'm using vb in the codebehind, is it necessary to have in the code
behind page in its own namespace with the following code you posted?
namespace ImplementIPostBackEventHandler
{
....
}
Thanks in advance,
Richard
"wi*****@googlemail.com" wrote:
Hi Richard,
The problem is that ASP maintains state by using ViewState. When you
post back a page, controls are first instantiated, then initialized
with values from ViewState, and at the very end, the SaveViewState
event is called. The next time you post back, the values that were
saved in the SaveViewState event will again be used to repopulate the
controls on Initialization.
When you modify controls like Dropdowns through Javascript (modify as
in add members, not changing the selected index), the server cannot
possibly know about this.
In your case, I would suggest you use the internal __doPostBack
Javscript function. You can check out the source of any aspx page in
your browser, and will find it there:
function __doPostBack(eventTarget, eventArgument) {
....
}
You also need your page to implement IPostBackEventHandler to handle
the async postback. An example follows:
aspx page:
<%@ Page Language="C#" AutoEventWireup="True"
CodeBehind="Default.aspx.cs"
Inherits="ImplementIPostBackEventHandler._Default"
EnableViewState="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<script>
function populateListBox() {
var lst = document.getElementById('theListBox');
var postBackArg = new Array()
for(var i = 1;i <= 3;i++) {
var newOptionName = "element_" + i;
var newOptionValue = i;
var newOption = new Option(newOptionName,
newOptionValue);
lst.options.add(newOption);
postBackArg[i-1] = newOptionName + "," +
newOptionValue;
}
__doPostBack('<%= this.ClientID %>',
postBackArg.join(";"));
}
</script>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="theListBox" runat="server" />
<input id="btnTriggerJs" type="button" value="btnTriggerJs"
OnClick="populateListBox()" />
<asp:Button ID="btnPostBack" OnClick="btnPostBack_Click"
Text="btnPostBack" runat="server" />
</div>
</form>
</body>
</html>
codebehind file:
using System;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ImplementIPostBackEventHandler
{
public partial class _Default : System.Web.UI.Page,
IPostBackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnPostBack_Click(object sender, EventArgs e)
{
foreach(ListItem li in theListBox.Items)
{
/* ... */
}
}
public void RaisePostBackEvent(string eventArg)
{
string[] newElements = eventArg.Split(';');
foreach(string newElement in newElements)
{
string[] newElementArray = newElement.Split(',');
theListBox.Items.Add(new ListItem(newElementArray[0],
newElementArray[1]));
}
}
}
}
================
Regards,
Steve www.stkomp.com
Richard wrote:
Hi,
I have an ASP .NET page with codebehind in a vb file.
The page has a dropdown control, and a JS function which used HTTP XML
Request to get the data from the database, and populate the dropdown.
Actually, the JS creates the OPTION elements using th retrieved db data, and
adds them to the SELECT element using DOM objects.
The dropdown works ok, and the items are visible, but when the user clicks
"Save" button, and the page posts back to the server, in the VB codebehind,
the selected value in the dropdown is empty, and the items collection is
empty.
Why is this? How can I fix this behavior?
Thanks in advance,
Richard
Hi Richard,
No, the namespace was automatically generated by VS. No need for it.
Just make sure that the Inherits directive in the aspx file will not
have a namespace either (eg, Inherits="_Default" instead of
Inherits="ImplementIPostBackEventHandler._Default" )
===========
Regards,
Steve www.stkomp.com
Richard wrote:
Thanks Steve, great explanation.
It'd be nice in JS to have a function to add objects to the viewstate ;-)
As I'm using vb in the codebehind, is it necessary to have in the code
behind page in its own namespace with the following code you posted?
namespace ImplementIPostBackEventHandler
{
...
}
Thanks in advance,
Richard
"wi*****@googlemail.com" wrote:
Hi Richard,
The problem is that ASP maintains state by using ViewState. When you
post back a page, controls are first instantiated, then initialized
with values from ViewState, and at the very end, the SaveViewState
event is called. The next time you post back, the values that were
saved in the SaveViewState event will again be used to repopulate the
controls on Initialization.
When you modify controls like Dropdowns through Javascript (modify as
in add members, not changing the selected index), the server cannot
possibly know about this.
In your case, I would suggest you use the internal __doPostBack
Javscript function. You can check out the source of any aspx page in
your browser, and will find it there:
function __doPostBack(eventTarget, eventArgument) {
....
}
You also need your page to implement IPostBackEventHandler to handle
the async postback. An example follows:
aspx page:
<%@ Page Language="C#" AutoEventWireup="True"
CodeBehind="Default.aspx.cs"
Inherits="ImplementIPostBackEventHandler._Default"
EnableViewState="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<script>
function populateListBox() {
var lst = document.getElementById('theListBox');
var postBackArg = new Array()
for(var i = 1;i <= 3;i++) {
var newOptionName = "element_" + i;
var newOptionValue = i;
var newOption = new Option(newOptionName,
newOptionValue);
lst.options.add(newOption);
postBackArg[i-1] = newOptionName + "," +
newOptionValue;
}
__doPostBack('<%= this.ClientID %>',
postBackArg.join(";"));
}
</script>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="theListBox" runat="server" />
<input id="btnTriggerJs" type="button" value="btnTriggerJs"
OnClick="populateListBox()" />
<asp:Button ID="btnPostBack" OnClick="btnPostBack_Click"
Text="btnPostBack" runat="server" />
</div>
</form>
</body>
</html>
codebehind file:
using System;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ImplementIPostBackEventHandler
{
public partial class _Default : System.Web.UI.Page,
IPostBackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnPostBack_Click(object sender, EventArgs e)
{
foreach(ListItem li in theListBox.Items)
{
/* ... */
}
}
public void RaisePostBackEvent(string eventArg)
{
string[] newElements = eventArg.Split(';');
foreach(string newElement in newElements)
{
string[] newElementArray = newElement.Split(',');
theListBox.Items.Add(new ListItem(newElementArray[0],
newElementArray[1]));
}
}
}
}
================
Regards,
Steve www.stkomp.com
Richard wrote:
Hi,
>
I have an ASP .NET page with codebehind in a vb file.
The page has a dropdown control, and a JS function which used HTTP XML
Request to get the data from the database, and populate the dropdown.
Actually, the JS creates the OPTION elements using th retrieved db data, and
adds them to the SELECT element using DOM objects.
>
The dropdown works ok, and the items are visible, but when the user clicks
"Save" button, and the page posts back to the server, in the VB codebehind,
the selected value in the dropdown is empty, and the items collection is
empty.
>
Why is this? How can I fix this behavior?
>
Thanks in advance,
>
Richard
Hello,
Steve, I really appreciate your help with this, and I know this example is a
very sophisticated code.
Now, somehow sending data in strings around, seems like the only solution in
Web applications!??, but it doesn't seem like a very good practice.
1) A dropdown could have many items with fairly long descriptions. If the
resulting string overflows the string size, we'd end up with a truncated
dropdown or an invalid string that cannot be parsed back into a dropdown.
2) With a string, its's hard to store state like "disabled" and other
members of the dropdown.
Seriously , isn't there a "best practice" kindof way of doing this?
Thanks in advance,
Richard
=====
"wi*****@googlemail.com" wrote:
Hi Richard,
No, the namespace was automatically generated by VS. No need for it.
Just make sure that the Inherits directive in the aspx file will not
have a namespace either (eg, Inherits="_Default" instead of
Inherits="ImplementIPostBackEventHandler._Default" )
===========
Regards,
Steve www.stkomp.com
Richard wrote:
Thanks Steve, great explanation.
It'd be nice in JS to have a function to add objects to the viewstate ;-)
As I'm using vb in the codebehind, is it necessary to have in the code
behind page in its own namespace with the following code you posted?
namespace ImplementIPostBackEventHandler
{
...
}
Thanks in advance,
Richard
"wi*****@googlemail.com" wrote:
Hi Richard,
>
The problem is that ASP maintains state by using ViewState. When you
post back a page, controls are first instantiated, then initialized
with values from ViewState, and at the very end, the SaveViewState
event is called. The next time you post back, the values that were
saved in the SaveViewState event will again be used to repopulate the
controls on Initialization.
>
When you modify controls like Dropdowns through Javascript (modify as
in add members, not changing the selected index), the server cannot
possibly know about this.
>
In your case, I would suggest you use the internal __doPostBack
Javscript function. You can check out the source of any aspx page in
your browser, and will find it there:
>
function __doPostBack(eventTarget, eventArgument) {
....
}
>
You also need your page to implement IPostBackEventHandler to handle
the async postback. An example follows:
>
aspx page:
>
<%@ Page Language="C#" AutoEventWireup="True"
CodeBehind="Default.aspx.cs"
Inherits="ImplementIPostBackEventHandler._Default"
EnableViewState="false" %>
>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<script>
function populateListBox() {
var lst = document.getElementById('theListBox');
var postBackArg = new Array()
for(var i = 1;i <= 3;i++) {
var newOptionName = "element_" + i;
var newOptionValue = i;
var newOption = new Option(newOptionName,
newOptionValue);
lst.options.add(newOption);
postBackArg[i-1] = newOptionName + "," +
newOptionValue;
}
__doPostBack('<%= this.ClientID %>',
postBackArg.join(";"));
}
</script>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="theListBox" runat="server" />
<input id="btnTriggerJs" type="button" value="btnTriggerJs"
OnClick="populateListBox()" />
<asp:Button ID="btnPostBack" OnClick="btnPostBack_Click"
Text="btnPostBack" runat="server" />
</div>
</form>
</body>
</html>
>
>
codebehind file:
using System;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
>
namespace ImplementIPostBackEventHandler
{
public partial class _Default : System.Web.UI.Page,
IPostBackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
}
>
protected void btnPostBack_Click(object sender, EventArgs e)
{
foreach(ListItem li in theListBox.Items)
{
/* ... */
}
}
>
public void RaisePostBackEvent(string eventArg)
{
string[] newElements = eventArg.Split(';');
foreach(string newElement in newElements)
{
string[] newElementArray = newElement.Split(',');
theListBox.Items.Add(new ListItem(newElementArray[0],
newElementArray[1]));
}
}
}
}
>
================
Regards,
Steve www.stkomp.com
>
Richard wrote:
Hi,
I have an ASP .NET page with codebehind in a vb file.
The page has a dropdown control, and a JS function which used HTTP XML
Request to get the data from the database, and populate the dropdown.
Actually, the JS creates the OPTION elements using th retrieved db data, and
adds them to the SELECT element using DOM objects.
The dropdown works ok, and the items are visible, but when the user clicks
"Save" button, and the page posts back to the server, in the VB codebehind,
the selected value in the dropdown is empty, and the items collection is
empty.
Why is this? How can I fix this behavior?
Thanks in advance,
Richard
>
This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Kevin Lyons |
last post by:
Hello,
I am trying to get my select options (courses) passed correctly from
the following URL: http://www.dslextreme.com/users/kevinlyons/selectBoxes.html
I am having difficulty getting the...
|
by: bin_P19 P |
last post by:
the code i have got is as follows and now im stuck
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Shopping...
|
by: beguigne |
last post by:
Below is a snippet of a crude date picking routine for a form. I am a
novice at this so, I am hitting my head at why when I select the day,
the onChange event gives me a blank. What am I missing?...
|
by: BrianP |
last post by:
Hi,
I have had to invent a work-around to get past what looks like a
JavaScript bug, the malfunctioning Perl-like JavaScript array functions
including SPLICE() and UNSHIFT().
I have boiled it...
|
by: monomaniac21 |
last post by:
hi i want to be able to trigger a javascript style popup alert in php
(i want a message displayed on the actual page) is this possible?
|
by: Adam Smith |
last post by:
Hello,
How can I call or trigger an external javascript twice in a form?
I have
<script language="JavaScript" src="country_state.js"
name="Country_State">
<script type="text/javascript"...
|
by: chunk1978 |
last post by:
hey everyone,
i've been trying to solve this problem for 2 days straight, with no end in sight. i would greatly appreciate anyone's help.
EXPLANATION: There are 3 Select Menus. The 1st and...
|
by: JLupear |
last post by:
My friend and I are trying to start a business and are writing a website of our own. We have been trying to create an online estimator and are having trouble with writing the javascript that is to...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
| |