苦思2天也搞不定,求高手相助!关于联动下拉框的传值问题

91619600 2004-03-29 12:12:35
我已经实现了两个下拉框的联动,方法是这样的:主下拉框(运行在服务器端的html dropdown)直接在page_load里进行绑定;然后把从下拉框的所有从类名、从类ID、以及其所属的大类ID从数据库取出存放到js的数组中。到这里全部正常,问题是提交页面的时候,小类的下拉框的值无法取得(总是为空),我用html的dropdown和web的dropdownlist都试过了。怎么会这样呢,哪位高手帮帮忙
...全文
143 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
SVG 2004-03-29
  • 打赏
  • 举报
回复
已经实现脚本动态下拉框了吧.
那就将动态下拉框的值放在一个 runat=server的hidden input 里, 在服务端将这个input.value
jupiterII 2004-03-29
  • 打赏
  • 举报
回复
呵呵,很简单,在页面上摆2个隐藏的TEXTBOX,然后在第2个DROPDOWNLIST的onchange事件(客户端的)中把选中的text和value放在那里,这样postback的时候就能从那2个textBox里取到值了
记得2个textBox的隐藏是设style="display:none",或者用runat=server的hidden input
91619600 2004-03-29
  • 打赏
  • 举报
回复
以上代码都是通过服务器脚本实现,需要来回传递。不行的,我要求js实现的
91619600 2004-03-29
  • 打赏
  • 举报
回复
我忘记说明了,必须是不能刷新的,因为一刷新,该页面的密码就要重输。所以OnSelectionChange和什么DataBind()都是不可能的,不过还是谢谢提议。我先看看贴出来的代码吧。
joelbh 2004-03-29
  • 打赏
  • 举报
回复
都用服务器的控制,应该不难吧,下面是我做的,注意我取数据是通过另外的类的方法来取得得:
if(!IsPostBack)
{
//得到大栏目列表
bigclassmanageclass GetBigClassObj=new bigclassmanageclass();

bigclass.DataSource =GetBigClassObj.getDataSet(strConn).Tables["bigclass"].DefaultView;
bigclass.DataTextField = "name_bigclass";
bigclass.DataValueField = "id_bigclass";
bigclass.DataBind();

//得到该大栏目下属的小栏目的列表
int bigClassId;
bigClassId=int.Parse(bigclass.SelectedItem.Value);

littleclassmanageclass GetLittleClassObj=new littleclassmanageclass();

littleclass.DataSource =GetLittleClassObj.getDataSet(strConn,bigClassId).Tables["littleclass"].DefaultView;
littleclass.DataTextField = "name_littleclass";
littleclass.DataValueField = "id_littleclass";
littleclass.DataBind();

}
Seeko0 2004-03-29
  • 打赏
  • 举报
回复
可能问题出在第二个列表的创建上,你可以在Page_Load 的时候创建这两个列表,然后在第一个列表选择改变的时候,提交服务器,在DownDownList1_Change(sender, e){
对DownDownList2重新DadaBind(),并设置DownDownList2选择项
}
mostice 2004-03-29
  • 打赏
  • 举报
回复
OnSelectionChange事件就可以。
asp_badboy 2004-03-29
  • 打赏
  • 举报
回复

不敢枉说~
先看看代码再说`~
贴吧~
xiaopai20 2004-03-29
  • 打赏
  • 举报
回复
建议把代码贴出来吧~~
CMIC 2004-03-29
  • 打赏
  • 举报
回复
代码贴出来看一下
showtimenow 2004-03-29
  • 打赏
  • 举报
回复
把绑定的代码写在!page.ispostback里面
SVG 2004-03-29
  • 打赏
  • 举报
回复
因为下拉框个数不定, postback 后状态难保,
所以就用 session 将 动态 web control 对象存起来,
具体实现不多说了,
看代码(因为摘自目前应用项目, 代码不完整):
public void okmchange(object o, EventArgs e)
{
DropDownList drp = (DropDownList)o;
if(Session["drpClientID"] == null)
Session["drpClientID"] = drp.ClientID.ToString().Replace("_", "$").Replace("$$", "$_");
HuaweiSoftware.GFCMS.GFCMSSC.Components.CostData.DSDevCostHasExtended dsSubject
= new DSDevCostHasExtended();
Cost cost = new Cost();
cost.FillProjectCostLevN(int.Parse(drp.SelectedValue), this.mProjectID, dsSubject);
Panel pnl = (Panel)drp.Parent.FindControl("pnlkm");

if(dsSubject.项目发展成本视图.Rows.Count > 0)
{
DropDownList drpSec = new DropDownList();
drpSec.DataSource = dsSubject.项目发展成本视图;
drpSec.DataTextField = "发展成本科目";
drpSec.DataValueField = "成本项目科目ID";
drpSec.Attributes["onchange"] = "javascript:ReturnValues(this);__doPostBack('lnkDrp', '')";
drpSec.DataBind();
drpSec.Items.Insert(0, new ListItem("--请选择--", "-1"));

pnl.Controls.Add(drpSec);
Session["pnl"] = pnl;

hdnRowIndex.Value = "null_-1_null";
}
}
#endregion

/// <summary>
/// 清除下拉框
/// </summary>
/// <param name="pnl"></param>
private void ClearDrps(Panel pnl)
{
int count = pnl.Controls.Count;
for(int i=0; i<count; i++)
pnl.Controls.RemoveAt(0);
}

/// <summary>
/// 消除index顺序后的下拉框
/// </summary>
/// <param name="pnl"></param>
/// <param name="index"></param>
private void ClearBehindDrp(Panel pnl, int index)
{
int count = pnl.Controls.Count;
for(int i=index; i<count-1; i++)
pnl.Controls.RemoveAt(index+1);
}
/// <summary>
/// 添加下拉框
/// </summary>
/// <param name="pnl">从Panel中读DropDownList</param>
/// <param name="tarPnl">添加到Panel</param>
private void AddDrps(Panel pnl, Panel tarPnl)
{
int count = pnl.Controls.Count;
for(int i=0; i<count; i++)
tarPnl.Controls.Add(pnl.Controls[0]);
}
/// <summary>
/// 增加下拉框
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lnkDrp_Click(object sender, System.EventArgs e)
{
string[] ary = hdnRowIndex.Value.Split('_');
int index = int.Parse(ary[2]);
Panel pnlPre = (Panel)Session["pnl"];
//当前 Panel
Panel pnl = (Panel)dg.Items[int.Parse(ary[0])-1].Cells[0].FindControl("pnlkm");

if(index != pnlPre.Controls.Count-1)
{
//清除后面的 DropDownList
ClearBehindDrp(pnlPre, index);

DropDownList drpPre = (DropDownList)pnlPre.Controls[pnlPre.Controls.Count-1];

//修改内存里的 Panel 里的 DropDownList 选中项
foreach(ListItem itm in drpPre.Items)
itm.Selected = false;
if(drpPre.Items.FindByValue(ary[1]) != null)drpPre.Items.FindByValue(ary[1]).Selected = true;

Session["selectedDrp"] = drpPre;

//恢复 PostBack 之前 Panel
ClearDrps(pnl);
AddDrps(pnlPre, pnl);

}
else
{
DropDownList drpPre = (DropDownList)pnlPre.Controls[pnlPre.Controls.Count-1];

//修改内存里的 Panel 里的 DropDownList 选中项
foreach(ListItem itm in drpPre.Items)
itm.Selected = false;
if(drpPre.Items.FindByValue(ary[1]) != null)drpPre.Items.FindByValue(ary[1]).Selected = true;

//恢复 PostBack 之前 Panel
ClearDrps(pnl);
AddDrps(pnlPre, pnl);

//新 DropDownList
HuaweiSoftware.GFCMS.GFCMSSC.Components.CostData.DSDevCostHasExtended dsSubject
= new HuaweiSoftware.GFCMS.GFCMSSC.Components.CostData.DSDevCostHasExtended();
HuaweiSoftware.GFCMS.GFCMSSC.Components.CostData.Cost cost
= new HuaweiSoftware.GFCMS.GFCMSSC.Components.CostData.Cost();
cost.FillProjectCostLevN(int.Parse(ary[1]), this.mProjectID, dsSubject);


DropDownList drpSec = new DropDownList();
if(dsSubject.项目发展成本视图.Rows.Count > 0)
{
drpSec.DataSource = dsSubject.项目发展成本视图;
drpSec.DataTextField = "发展成本科目";
drpSec.DataValueField = "成本项目科目ID";
drpSec.Attributes["onchange"] = "javascript:ReturnValues(this);__doPostBack('lnkDrp', '')";
drpSec.DataBind();
drpSec.Items.Insert(0, new ListItem("--请选择--", "-1"));

pnl.Controls.Add(drpSec);

ary[1] = "-1";
ary[2] = (pnl.Controls.Count -1).ToString();
hdnRowIndex.Value = string.Join("_", ary);
}
//储存选中值
if(drpPre.SelectedIndex == 0)
Session["selectedDrp"] = null;
else
Session["selectedDrp"] = (dsSubject.项目发展成本视图.Rows.Count == 0?drpPre:drpSec);

}
//保存当前的 Panel
Session["pnl"] = pnl;
}
..
wggwan 2004-03-29
  • 打赏
  • 举报
回复
这个简单啊!
给你个具体的例子你看看吧。
private void getclass()//绑定班级
{
cn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(ConfigurationSettings.AppSettings["ds"]));
string strSQL="select * from class where cl_dep_num='"+listdep.SelectedItem.Value+"'";//取得学院Value值
da=new OleDbDataAdapter(strSQL,cn);
cn.Open();
ds=new DataSet();
da.Fill(ds);
listclass.DataSource=ds;
listclass.DataTextField="cl_name";
listclass.DataValueField="cl_num";
listclass.DataBind();
cn.Close();
}
private void getdepart()//绑定学院
{
cn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(ConfigurationSettings.AppSettings["ds"]));
string strSQL="select * from department";
da=new OleDbDataAdapter(strSQL,cn);
cn.Open();
ds=new DataSet();
da.Fill(ds);
listdep.DataSource=ds;
listdep.DataTextField="d_name";
listdep.DataValueField="d_num";
listdep.DataBind();
cn.Close();
}
同时把绑定学院的AutoPostBack属性设置为true。在绑定学院的DropDownList添加事件SelectedIndexChanged中加入
getclass();
beginer4program 2004-03-29
  • 打赏
  • 举报
回复
两个下拉列表都用服务器控件,第一个page_load中绑定,第二个根据第一个列表中的选择触发OnSelectionChange事件,然后在这个事件的处理代码中写入填充第二个列表的代码。
91619600 2004-03-29
  • 打赏
  • 举报
回复
这个问题没有经历过是肯定回答不来的
fengling181 2004-03-29
  • 打赏
  • 举报
回复
都用服务器控件不行吗?
91619600 2004-03-29
  • 打赏
  • 举报
回复
谢谢SVG(ben),虽然方法是龌龊了一点,呵呵
谢谢 littlehb(我想有一辆GOLF) 的ftp
谢谢所有发言的人,结贴!
wudixiaocaoren 2004-03-29
  • 打赏
  • 举报
回复
ftp://uncj.net:bdfsz.com.cn@211.162.77.132/。NET类\开发用的资源\DROPDOWN的三级例子.rar
lyhold 2004-03-29
  • 打赏
  • 举报
回复
用webcontrol是可以的,我这是三级联动,实现树性结构数据的录入。三个dropdownlist

62,249

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧