在C#web表单中单击[OK]后,如何在.aspx页面之间传递变量
我不熟悉网络表单 1) 我的默认web表单是default.aspx。它有两个组合框和一个按钮控件:所有ASP.NETWeb控件 2) 在页面u load()中,我创建了一个C对象“ScoringInfo()”: 受保护的无效页面加载(对象发送方、事件参数e) { scoringInfo=新的scoringInfo(); ... 3) ScoringInfo将数据库中的一些信息读取到成员变量中,并使用成员变量填充组合框: scoringInfo.GetOpenCrossByDate(dt, openCrossInfo); cbAvailableBowlers.Items.Clear (); foreach (OpenCrossInfoRec rec in openCrossInfo) string s = String.Format( "Lane {0:00}: {1}", rec.laneNo, rec.dateTime); cbAvailableBowlers.Items.Add(s); ... scoringInfo.GetOpenCrossByDate(dt,openCrossInfo); cbAvailableBowlers.Items.Clear(); foreach(openCrossInfo中的OpenCrossInfoRec) 串= 字符串格式( “车道{0:00}:{1}”, 记录laneNo,记录dateTime); cbAvailableBowlers.Items.Add; ... 4) 以下是成员变量: ... protected ScoringInfo scoringInfo; protected List leagueInfo = new List(); protected List openCrossInfo = new List(); ... 受保护的ScoringInfo ScoringInfo; 受保护列表leagueInfo=新列表(); 受保护列表openCrossInfo=新列表(); 5) 当用户按下按钮时,我想显示第二个.aspx页面,该页面处理用户选择的特定组合框项。下面是我的“OnClick”事件处理程序: protected void bTest_Click1(object sender, EventArgs e) { int idx = cbAvailableBowlers.SelectedIndex; Session["openCrossLaneUniqueId"] = openCrossInfo[idx].laneUniqueId; ...// THIS FAILS: // "ARGUMENT OUT OF RANGE" exception; // "idx" is 0; openCrossInfo[] list is empty... 受保护的无效B测试点击1(对象发送者,事件参数e) { int idx=cbAvailableBowlers.SelectedIndex; 会话[“openCrossLaneUniqueId”]=openCrossInfo[idx].laneUniqueId; …//此操作失败: //“参数超出范围”例外; //“idx”为0;openCrossInfo[]列表为空。。。 它不起作用…因为成员变量“openCrossInfo[]”和组合框属性SelectedIndex在执行bTest_Click1时似乎不再有效在C#web表单中单击[OK]后,如何在.aspx页面之间传递变量,c#,webforms,session-state,C#,Webforms,Session State,我不熟悉网络表单 1) 我的默认web表单是default.aspx。它有两个组合框和一个按钮控件:所有ASP.NETWeb控件 2) 在页面u load()中,我创建了一个C对象“ScoringInfo()”: 受保护的无效页面加载(对象发送方、事件参数e) { scoringInfo=新的scoringInfo(); ... 3) ScoringInfo将数据库中的一些信息读取到成员变量中,并使用成员变量填充组合框: scoringInfo.GetOpenCrossByDate(dt, op
如何/在何处保存同一会话中其他后续页面的UI状态?页面的成员变量(如openCrossInfo)不会在请求之间持续。每次新请求传入时,都会再次创建.aspx的页面对象。因此,当bTest_Click事件触发时,它正在处理页面对象的新副本。您的openCrossInfo数组没有值,因为页面对象刚刚创建,即使您在以前的请求中设置了它。
如果要保存状态,则必须使用其他内容,如会话状态。正如Jay Douglass指出的那样,问题在于原始页面中的成员变量“openCrossInfo”没有持久化到新的“回发”页面 解决办法是:
受保护的无效页面加载(对象发送方,事件参数e)
{
scoringInfo=新的scoringInfo();
如果(!IsPostBack)
{
//第一次,使用当前日期/时间;创建新数据
leagueInfo=新列表();
openCrossInfo=新列表();
laneUniqueIds=新列表();
updateGui(DateTime.Now);
会话[“leagueInfo”]=leagueInfo;
会话[“openCrossInfo”]=openCrossInfo;
会话[“laneUniqueIds”]=laneUniqueIds;
}
其他的
{
//后续回调:检索状态
leagueInfo=(列表)会话[“leagueInfo”];
openCrossInfo=(列表)会话[“openCrossInfo”];
laneUniqueIds=(列表)会话[“laneUniqueIds”];
}
}
protected void bTest_Click1(object sender, EventArgs e)
{
int idx = cbAvailableBowlers.SelectedIndex;
Session["openCrossLaneUniqueId"] = openCrossInfo[idx].laneUniqueId;
...// THIS FAILS:
// "ARGUMENT OUT OF RANGE" exception;
// "idx" is 0; openCrossInfo[] list is empty...
protected void Page_Load(object sender, EventArgs e)
{
scoringInfo = new ScoringInfo();
if (!IsPostBack)
{
// 1st time, use current date/time; create new data
leagueInfo = new List<LeagueInfoRec>();
openCrossInfo = new List<OpenCrossInfoRec>();
laneUniqueIds = new List<string>();
updateGui(DateTime.Now);
Session["leagueInfo"] = leagueInfo;
Session["openCrossInfo"] = openCrossInfo;
Session["laneUniqueIds"] = laneUniqueIds;
}
else
{
// Subsequent callbacks: retrieve state
leagueInfo = (List<LeagueInfoRec>)Session["leagueInfo"];
openCrossInfo = (List<OpenCrossInfoRec>)Session["openCrossInfo"];
laneUniqueIds = (List<string>)Session["laneUniqueIds"];
}
}