用户控件中有个DropDownList, 是在控件代码中动态填充
加载到页面时,如何在页面文件修改DropDownList的选择值?
调用用户控件的public方法修改是不成功的,修改DropDownList是一个空值的

解决方案 »

  1.   

    为你的用户添加一个属性:public DropDownList UserControlddl
    {
        get{return this.DropDownList1;}
    }
      

  2.   

    意思表达得有点迷糊,1楼可能不能解决LZ的问题
    不然的话usercontrol的dropdownlist修改为public后,usercontrol.dropdownlist肯定可以做操作,而不会是空值(你这个确定绑定成功了吧??)LZ把问题描述的清楚点
      

  3.   

    这个我试过,返回的是一个空的控件,就算填充了返回,有数据,但还是不能改变页面DropDownList的值,感觉不是在操作同一个控件    public string CurrentValue { get; set;}    public DropDownList InnerDropDownListTree
        {
            get
            {
                LoadTree();
                return DropDownListTree;    
            }
        }上面是我的代码,能用属性得到当前的值,但方法就是不能修改DropDownList ddl = (DropDownList)ArticleClassDDL1.FindControl("DropDownListTree");就算在页面找到控件,怎么也是个空的
      

  4.   


    你指的绑定成功是什么?
    我是读取一个DataSet,然后把值Insert到dropdownlist控件的
      

  5.   

    LoadTree()这个是不是绑定dropdownlist的方法阿?如果是的话,那你不是用属性取一次dropdownlist就重新绑定一次了?没有完整的代码,无法得知到底什么问题
      

  6.   


    汗。。dropdownlist可以直接绑定数据源的阿。不过你循环insert也一样的
      

  7.   

    LoadTree()方法是干什么的?最好能把你的代码贴全一点,我感觉这个问题不是很难的
      

  8.   

    参考相关的:
    http://www.cnblogs.com/insus/articles/1431940.html
      

  9.   


    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
      

  10.   

    if(!IsPostBack)
    {
       内容写在这里
    }
      

  11.   


    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了
      

  12.   

    参考,测试通过:    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);
            }
      

  13.   

    修改DropDownList的选择值?
    this.UserControl.InnerDropDownListTree.SelectedValue="xxx";
    注意,你的SelectedValue必须是你绑定的数据中存在的项,否则修改无效
      

  14.   

    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事件更改呢,我在这个事件测试,取到的还是一个空值
    谢谢
      

  15.   

    this.UserControl.InnerDropDownListTree.SelectedValue
    页面第一次加载时这个总是一个空值,明明是看的到数据的
      

  16.   


    由于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;
    }
      

  17.   

    to:ojlovecd protected void Page_Load(object sender, EventArgs e)
    {
        WebUserControl1.LoadTree();
        WebUserControl1.InnerDropDownListTree.SelectedIndex = 2;
    }
    用你这个方法,DropDownListTree的值还是没有改变,还是最初的0,感觉操作了不同的控件
    不知道你测试值改变了没有
      

  18.   

    to:ojlovecd 
    搞定了,明白你的意思了,不在控件中填充,在PAGE中填充