我自定义了一个WEB用户空控件
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ContArea.ascx.cs" Inherits="HtmlKj_ContArea" %>
       <asp:DropDownList ID="CityArea1" runat="server" AutoPostBack="True" 
    onselectedindexchanged="CityArea1_SelectedIndexChanged" >
              <asp:ListItem Value="25">云南省</asp:ListItem>
          </asp:DropDownList>
          <asp:DropDownList ID="CityArea2" runat="server" AutoPostBack="True" 
    onselectedindexchanged="CityArea2_SelectedIndexChanged">
              <asp:ListItem Value="0">请选择地区</asp:ListItem>
          </asp:DropDownList>
          <asp:DropDownList ID="CityArea3" runat="server">
              <asp:ListItem Value="0">请选择县市</asp:ListItem>
          </asp:DropDownList>
          
后台代码是这样的:using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
public partial class HtmlKj_ContArea : System.Web.UI.UserControl
{    public string _CityArea1
    {
        get { return CityArea1.SelectedValue; }
        set { CityArea1.SelectedValue = value; }
    }
    public string _CityArea2
    {
        get { return CityArea2.SelectedValue; }
        set { CityArea2.SelectedValue = value; }
    }
    public string _CityArea3
    {
        get { return CityArea3.SelectedValue; }
        set { CityArea3.SelectedValue = value; }
    }
    DataBase dab = new DataBase();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SelectarArea(0, 0);
        }
    }
    protected void SelectarArea(int parentID,int stype)
    {
        if (parentID == 0)
        {
            CityArea1.Items.Clear();
            CityArea1.Items.Add(new ListItem("请选择", "0"));
            string sql = "select * from [Base_Area] where  AreaID=25";
            SqlDataReader dr = dab.datareader(sql);
            while (dr.Read())
            {
                CityArea1.Items.Add(new ListItem(dr["AreaName"].ToString(), dr["AreaID"].ToString()));
            }
            dr.Close();
            dab.close();
        }
        else
        {
            if (stype == 1)
            {
                CityArea2.Items.Clear();
                CityArea3.Items.Clear();
                CityArea3.Items.Add(new ListItem("请选择县市", "0"));
            }
            else if (stype == 2)
            {
                CityArea3.Items.Clear();
                CityArea3.Items.Add(new ListItem("请选择县市", "0"));
            }
            else
            {
                CityArea1.Items.Clear();
            } 
            string sql = "select * from [Base_Area] where ParentID=" + parentID + " and State=0";
            SqlDataReader dr = dab.datareader(sql);
            while (dr.Read())
            {
                if (stype == 1)
                {
                    CityArea2.Items.Add(new ListItem(dr["AreaName"].ToString(), dr["AreaID"].ToString()));
                }
                else if (stype == 2)
                {
                    CityArea3.Items.Add(new ListItem(dr["AreaName"].ToString(), dr["AreaID"].ToString()));
                }
                else
                {
                    CityArea1.Items.Add(new ListItem(dr["AreaName"].ToString(), dr["AreaID"].ToString()));
                }
                
            }
            dr.Close();
            dab.close();
        }
    }
    protected void CityArea2_SelectedIndexChanged(object sender, EventArgs e)
    {
        int paid = Int32.Parse(CityArea2.SelectedValue);
        SelectarArea(paid, 2);
    }
    protected void CityArea1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int paid = Int32.Parse(CityArea1.SelectedValue);
        SelectarArea(paid, 1);
    }
}我在index.aspx里面调用ContArea.ascx的时候,只能接收到一个值
 string _City1 = ContArea1._CityArea1;第一个_City1正确
 string _City2=  ContArea1._CityArea2;第二个这一句就错误,找不到_CityArea2 也没有_CityArea3帮帮忙啊,大哥们怎么解决

解决方案 »

  1.   

    回发了
      page_load判断if(!page.ispostback)
      

  2.   

    Page_Load判断
     if (!IsPostBack)
            {
                //code
            }
      

  3.   

    应该是你获取值的时机没有弄对,看了下你的代码基本没有问题,也不是ispostback的问题总之页面执行的顺序是 主页pageload-控件pageload-点击事件代码(主页控件都一样)-返回结果你获取area2,3的时机不对吧,在没有点击area1,2的时候area2,3就没有值,你看看是否逻辑出错
      

  4.   

    代码太多,根本没有时间看(你也没有吸引我花时间看你的代码)。随便说一些,通常在用户控件中的属性应该这样写:public int X
    {
        get
        {
            EnsureChildControl();
            .......
        }
        set{
            EnsureChildControl();
            .......
        }
    }如果你的写法是从哪一本入门书或者视频上学来的,我建议你将那本书或者视频网站定位为“坑害初学者”的。这个EnsureChildControl机制确实是asp.net组件开发中所不允许忽视的基本知识。
      

  5.   

    自己搜索一下 EnsureChildControl 的概念吧。你知道了这个只是,才会发觉这为什么是必要的。然后有太多的号称asp.net程序的人不知道它,我猜有一些网络上出现的不正规的培训机构的视频坑害了不少初学者。
      

  6.   

    自己搜索一下 EnsureChildControl 的概念吧。你知道了这个知识,才会发觉这为什么是必要的。然后有太多的号称asp.net程序的人不知道它,我猜有一些网络上出现的不正规的培训机构的视频坑害了不少初学者。
      

  7.   

    回复 sp1234,谈谈个人观点哈
    也许你确实没有仔细看楼主的代码,了解他的需求,这一点不怪你哈
    你站的高度与我们不同,所以不要把“将那本书或者视频网站定位为“坑害初学者”的”这样话说得太绝对,也许你是把asp.net的控件研究透彻了,但是这不一定代表你有这个权利说这种大话,也看过多本书多种资料(不属于你这样的“研究”人员),但是在一般应用中,比如就是普通的简单的用户控件中很多时候根本就不需要EnsureChildControl,翻了很多控件代码,都很少看到使用该方法的,当然根据ensure这个方法来看,是在复合控件中才用到,目的很简单,不用它也完全可以的。总之,不常用的,大家都少于知道的你拿出来就当宝,让别人觉得你很高深,当然sp前辈确实是学识渊博无可厚非,感觉这样实在是不好啊