用户控件中的控件操作问题 用户控件中有个DropDownList, 是在控件代码中动态填充加载到页面时,如何在页面文件修改DropDownList的选择值?调用用户控件的public方法修改是不成功的,修改DropDownList是一个空值的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为你的用户添加一个属性:public DropDownList UserControlddl{ get{return this.DropDownList1;}} 意思表达得有点迷糊,1楼可能不能解决LZ的问题不然的话usercontrol的dropdownlist修改为public后,usercontrol.dropdownlist肯定可以做操作,而不会是空值(你这个确定绑定成功了吧??)LZ把问题描述的清楚点 这个我试过,返回的是一个空的控件,就算填充了返回,有数据,但还是不能改变页面DropDownList的值,感觉不是在操作同一个控件 public string CurrentValue { get; set;} public DropDownList InnerDropDownListTree { get { LoadTree(); return DropDownListTree; } }上面是我的代码,能用属性得到当前的值,但方法就是不能修改DropDownList ddl = (DropDownList)ArticleClassDDL1.FindControl("DropDownListTree");就算在页面找到控件,怎么也是个空的 你指的绑定成功是什么?我是读取一个DataSet,然后把值Insert到dropdownlist控件的 LoadTree()这个是不是绑定dropdownlist的方法阿?如果是的话,那你不是用属性取一次dropdownlist就重新绑定一次了?没有完整的代码,无法得知到底什么问题 汗。。dropdownlist可以直接绑定数据源的阿。不过你循环insert也一样的 LoadTree()方法是干什么的?最好能把你的代码贴全一点,我感觉这个问题不是很难的 参考相关的:http://www.cnblogs.com/insus/articles/1431940.html public partial class Admin_Control_ArticleClassDDL : System.Web.UI.UserControl{ //public System.Web.UI.WebControls.DropDownList DropDownListTree; public string CurrentValue { get; set;} public DropDownList InnerDropDownListTree { get { LoadTree(); return DropDownListTree; } } protected void Page_Load(object sender, EventArgs e) { //if (!IsPostBack) //{ LoadTree(); //} CurrentValue = this.DropDownListTree.SelectedValue; } protected void LoadTree() { this.DropDownListTree.Items.Clear(); DataSet ds = ArticleClassBll.GetTree(); string strName = null; //this.DropDownListTree.Items.Insert(0, new ListItem("无(做为一级分类)", "0")); for (int i = 0; i < ds.Tables["ArticleClass"].Rows.Count; i++) { strName = null; for (int j = 0; j < Convert.ToInt32(ds.Tables["ArticleClass"].Rows[i]["depth"]); j++) { strName = strName + (char)0xa0 + (char)0xa0 + (char)0xa0; } strName = strName + ">" + ds.Tables["ArticleClass"].Rows[i]["ac_name"].ToString(); ListItem li = new ListItem(strName, ds.Tables["ArticleClass"].Rows[i]["ac_id"].ToString()); this.DropDownListTree.Items.Insert(i , li); } } protected void DropDownListTree_SelectedIndexChanged(object sender, EventArgs e) { CurrentValue = this.DropDownListTree.SelectedValue.ToString(); } }这是用户控件的全部代码,因为要在名称前插空格无法直接绑定,只能用Insert if(!IsPostBack){ 内容写在这里} public partial class Admin_Control_ArticleClassDDL : System.Web.UI.UserControl{ //public System.Web.UI.WebControls.DropDownList DropDownListTree; public string CurrentValue { get; set;} public DropDownList InnerDropDownListTree { get { LoadTree(); return DropDownListTree; } } protected void Page_Load(object sender, EventArgs e) { //if (!IsPostBack) //{ LoadTree(); //} CurrentValue = this.DropDownListTree.SelectedValue; } protected void LoadTree() { this.DropDownListTree.Items.Clear(); DataSet ds = ArticleClassBll.GetTree(); string strName = null; //this.DropDownListTree.Items.Insert(0, new ListItem("无(做为一级分类)", "0")); for (int i = 0; i < ds.Tables["ArticleClass"].Rows.Count; i++) { strName = null; for (int j = 0; j < Convert.ToInt32(ds.Tables["ArticleClass"].Rows[i]["depth"]); j++) { strName = strName + (char)0xa0 + (char)0xa0 + (char)0xa0; } strName = strName + ">" + ds.Tables["ArticleClass"].Rows[i]["ac_name"].ToString(); ListItem li = new ListItem(strName, ds.Tables["ArticleClass"].Rows[i]["ac_id"].ToString()); this.DropDownListTree.Items.Insert(i , li); } } protected void DropDownListTree_SelectedIndexChanged(object sender, EventArgs e) { CurrentValue = this.DropDownListTree.SelectedValue.ToString(); } public string ItemSelected() { LoadTree(); //this.DropDownListTree.Items.FindByValue(CurrentValue).Selected = true; return this.DropDownListTree.SelectedItem.Text; }}这是全部代码,因为要在名称前插空格,只能用Insert了 参考,测试通过: public partial class WebUserControl2 : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { LoadTree(); } } public DropDownList InnerDropDownListTree { get { return this.DropDownList1; } } private void LoadTree() { this.DropDownList1.Items.Clear(); DataTable dt = new DataTable(); dt.Columns.AddRange(new DataColumn[] { new DataColumn("C1", typeof(int)), new DataColumn("C2", typeof(int)) }); for (int i = 0; i < 10; i++) dt.Rows.Add(i, i * 10); foreach (DataRow dr in dt.Rows) this.DropDownList1.Items.Add(new ListItem(dr[0].ToString(), dr[1].ToString())); } }调用页面:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EMail.aspx.cs" Inherits="WebApplication1.EMail" ValidateRequest="false" %><%@ Register Src="~/WebUserControl2.ascx" TagName="UC2" TagPrefix="UC" %><!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></title></head><body> <form id="form1" runat="server"> <div> <UC:UC2 ID="UC2" runat="server" /> <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" /> </div> </form></body></html>后台: protected void Page_Load(object sender, EventArgs e) { } protected void Button2_Click(object sender, EventArgs e) { Response.Write(UC2.InnerDropDownListTree.SelectedValue); } 修改DropDownList的选择值?this.UserControl.InnerDropDownListTree.SelectedValue="xxx";注意,你的SelectedValue必须是你绑定的数据中存在的项,否则修改无效 to:ojlovecd protected void Page_Load(object sender, EventArgs e) { Response.Write(WebUserControl1.InnerDropDownListTree.Items.Count.ToString() + "<br />"); } protected void Button1_Click(object sender, EventArgs e) { //Response.Write(WebUserControl1.InnerDropDownListTree.SelectedValue); WebUserControl1.InnerDropDownListTree.SelectedIndex = 2; }我用你的方法做了一次,用按钮是可以改变值了,我想在Page_Load事件更改呢,我在这个事件测试,取到的还是一个空值谢谢 this.UserControl.InnerDropDownListTree.SelectedValue页面第一次加载时这个总是一个空值,明明是看的到数据的 由于Page的Page_Load是发生在控件的Page_Load之前的,所以,你添加DropDownList项的代码就不能写在控件的Page_Load里了,你可以参考以下方法:首先把你这个LoadTree方法改成public的,共外部调用,然后在Page的Page_Load中先调用此方法,然后再指定选中项:protected void Page_Load(object sender, EventArgs e){ WebUserControl1.LoadTree(); WebUserControl1.InnerDropDownListTree.SelectedIndex = 2;} to:ojlovecd protected void Page_Load(object sender, EventArgs e){ WebUserControl1.LoadTree(); WebUserControl1.InnerDropDownListTree.SelectedIndex = 2;}用你这个方法,DropDownListTree的值还是没有改变,还是最初的0,感觉操作了不同的控件不知道你测试值改变了没有 to:ojlovecd 搞定了,明白你的意思了,不在控件中填充,在PAGE中填充 一算法! asp.net 有像xlGrid那样的报表控件吗? 微软企业库连接 sqlite 总是提示出错: 关于C#页面服务的问题 gridview删除问题,在线急等 请问有什么好的工具,可以用数据库生成代码? 我在存储过程中用exec执行插入语句,怎么不能给字段赋空值? 一个初学者的.net问题!!大大帮忙解决一下!!!!! 为什么我写的控件加不上图标 MVC3 属性特性验证问题 我自己做的网站打不开 求助可以同时上传多个文件的源码,并可以自己命名文件名保存到数据库中.
{
get{return this.DropDownList1;}
}
不然的话usercontrol的dropdownlist修改为public后,usercontrol.dropdownlist肯定可以做操作,而不会是空值(你这个确定绑定成功了吧??)LZ把问题描述的清楚点
{
get
{
LoadTree();
return DropDownListTree;
}
}上面是我的代码,能用属性得到当前的值,但方法就是不能修改DropDownList ddl = (DropDownList)ArticleClassDDL1.FindControl("DropDownListTree");就算在页面找到控件,怎么也是个空的
你指的绑定成功是什么?
我是读取一个DataSet,然后把值Insert到dropdownlist控件的
汗。。dropdownlist可以直接绑定数据源的阿。不过你循环insert也一样的
http://www.cnblogs.com/insus/articles/1431940.html
public partial class Admin_Control_ArticleClassDDL : System.Web.UI.UserControl
{
//public System.Web.UI.WebControls.DropDownList DropDownListTree;
public string CurrentValue { get; set;} public DropDownList InnerDropDownListTree
{
get
{
LoadTree();
return DropDownListTree;
}
}
protected void Page_Load(object sender, EventArgs e)
{
//if (!IsPostBack)
//{
LoadTree();
//}
CurrentValue = this.DropDownListTree.SelectedValue;
} protected void LoadTree()
{
this.DropDownListTree.Items.Clear(); DataSet ds = ArticleClassBll.GetTree();
string strName = null;
//this.DropDownListTree.Items.Insert(0, new ListItem("无(做为一级分类)", "0")); for (int i = 0; i < ds.Tables["ArticleClass"].Rows.Count; i++)
{
strName = null;
for (int j = 0; j < Convert.ToInt32(ds.Tables["ArticleClass"].Rows[i]["depth"]); j++)
{
strName = strName + (char)0xa0 + (char)0xa0 + (char)0xa0;
}
strName = strName + ">" + ds.Tables["ArticleClass"].Rows[i]["ac_name"].ToString(); ListItem li = new ListItem(strName, ds.Tables["ArticleClass"].Rows[i]["ac_id"].ToString()); this.DropDownListTree.Items.Insert(i , li);
}
} protected void DropDownListTree_SelectedIndexChanged(object sender, EventArgs e)
{
CurrentValue = this.DropDownListTree.SelectedValue.ToString();
}
}
这是用户控件的全部代码,因为要在名称前插空格无法直接绑定,只能用Insert
{
内容写在这里
}
public partial class Admin_Control_ArticleClassDDL : System.Web.UI.UserControl
{
//public System.Web.UI.WebControls.DropDownList DropDownListTree;
public string CurrentValue { get; set;} public DropDownList InnerDropDownListTree
{
get
{
LoadTree();
return DropDownListTree;
}
}
protected void Page_Load(object sender, EventArgs e)
{
//if (!IsPostBack)
//{
LoadTree();
//}
CurrentValue = this.DropDownListTree.SelectedValue;
} protected void LoadTree()
{
this.DropDownListTree.Items.Clear(); DataSet ds = ArticleClassBll.GetTree();
string strName = null;
//this.DropDownListTree.Items.Insert(0, new ListItem("无(做为一级分类)", "0")); for (int i = 0; i < ds.Tables["ArticleClass"].Rows.Count; i++)
{
strName = null;
for (int j = 0; j < Convert.ToInt32(ds.Tables["ArticleClass"].Rows[i]["depth"]); j++)
{
strName = strName + (char)0xa0 + (char)0xa0 + (char)0xa0;
}
strName = strName + ">" + ds.Tables["ArticleClass"].Rows[i]["ac_name"].ToString(); ListItem li = new ListItem(strName, ds.Tables["ArticleClass"].Rows[i]["ac_id"].ToString()); this.DropDownListTree.Items.Insert(i , li);
}
} protected void DropDownListTree_SelectedIndexChanged(object sender, EventArgs e)
{
CurrentValue = this.DropDownListTree.SelectedValue.ToString();
} public string ItemSelected()
{
LoadTree();
//this.DropDownListTree.Items.FindByValue(CurrentValue).Selected = true;
return this.DropDownListTree.SelectedItem.Text;
}}这是全部代码,因为要在名称前插空格,只能用Insert了
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadTree();
}
}
public DropDownList InnerDropDownListTree
{
get
{
return this.DropDownList1;
}
} private void LoadTree()
{
this.DropDownList1.Items.Clear();
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] { new DataColumn("C1", typeof(int)), new DataColumn("C2", typeof(int)) });
for (int i = 0; i < 10; i++)
dt.Rows.Add(i, i * 10);
foreach (DataRow dr in dt.Rows)
this.DropDownList1.Items.Add(new ListItem(dr[0].ToString(), dr[1].ToString()));
}
}
调用页面:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EMail.aspx.cs" Inherits="WebApplication1.EMail" ValidateRequest="false" %>
<%@ Register Src="~/WebUserControl2.ascx" TagName="UC2" TagPrefix="UC" %>
<!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></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<UC:UC2 ID="UC2" runat="server" />
<asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" />
</div>
</form>
</body>
</html>后台: protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button2_Click(object sender, EventArgs e)
{
Response.Write(UC2.InnerDropDownListTree.SelectedValue);
}
this.UserControl.InnerDropDownListTree.SelectedValue="xxx";
注意,你的SelectedValue必须是你绑定的数据中存在的项,否则修改无效
{
Response.Write(WebUserControl1.InnerDropDownListTree.Items.Count.ToString() + "<br />");
}
protected void Button1_Click(object sender, EventArgs e)
{
//Response.Write(WebUserControl1.InnerDropDownListTree.SelectedValue);
WebUserControl1.InnerDropDownListTree.SelectedIndex = 2;
}我用你的方法做了一次,用按钮是可以改变值了,我想在Page_Load事件更改呢,我在这个事件测试,取到的还是一个空值
谢谢
页面第一次加载时这个总是一个空值,明明是看的到数据的
由于Page的Page_Load是发生在控件的Page_Load之前的,所以,你添加DropDownList项的代码就不能写在控件的Page_Load里了,你可以参考以下方法:
首先把你这个LoadTree方法改成public的,共外部调用,然后在Page的Page_Load中先调用此方法,然后再指定选中项:protected void Page_Load(object sender, EventArgs e)
{
WebUserControl1.LoadTree();
WebUserControl1.InnerDropDownListTree.SelectedIndex = 2;
}
{
WebUserControl1.LoadTree();
WebUserControl1.InnerDropDownListTree.SelectedIndex = 2;
}
用你这个方法,DropDownListTree的值还是没有改变,还是最初的0,感觉操作了不同的控件
不知道你测试值改变了没有
搞定了,明白你的意思了,不在控件中填充,在PAGE中填充