写了个评分的控件,想用来实现星级评分的功能,控件如下:
<asp:DataList ID="DataList1" runat="server" RepeatDirection="Horizontal" 
    Width="100px">
<ItemTemplate>
    <asp:ImageButton ID="ibtstar" runat="server" 
        CommandArgument=<%#Container.ItemIndex+1 %> ImageUrl="~/images/stars4.png" 
        onclick="ibtstar_Click" Enabled="false" />
</ItemTemplate>
</asp:DataList>
后台:public partial class EvaluationWithoutUpdatePanel : System.Web.UI.UserControl
    {
        int _stars;
        bool _enableevaluation;
        protected void Page_Load(object sender, EventArgs e)
        {
                CreateData();
        }        void CreateData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("stars");
            for (int i = 0; i < 5; i++)
            {
                DataRow dr = dt.NewRow();
                dt.Rows.Add(dr);
            }
            DataList1.DataSource = dt;
            DataList1.DataBind();
            for (int j = 0; j < _stars; j++)
            {
                ImageButton ibt = DataList1.Items[j].FindControl("ibtstar") as ImageButton;
                ibt.ImageUrl = "~/images/star1.png";
            }
            for (int i = 0; i < DataList1.Items.Count; i++)
            {
                ImageButton ibt = DataList1.Items[i].FindControl("ibtstar") as ImageButton;
                if (ibt != null)
                {
                    ibt.Enabled = _enableevaluation;
                }
            }
        }        public int Stars
        {
            get { return _stars; }
            set { _stars= value;  }
        }        public bool EnableEvaluation
        {
            set { _enableevaluation = value; }
        }        protected void ibtstar_Click(object sender, ImageClickEventArgs e)
        {
            ImageButton ibt = sender as ImageButton;
            if (ibt != null)
            {
                _stars = Convert.ToInt32(ibt.CommandArgument);
            }
            CreateData();
        }
    }
调用它的父控件:<asp:GridView ID="grid" runat="server" AutoGenerateColumns="False">
<ItemTemplate>
                       
                        <uc3:EvaluationWithoutUpdatePanel ID="EvaluationWithoutUpdatePanel1" 
                            runat="server" Stars=<%#Convert.ToInt32(Eval("pingjia").ToString()) %> EnableEvaluation="false" />
                       
                    </ItemTemplate>
 </asp:GridView>
后台只是简单的绑定,另外还有个查询按钮。
问题:
页面加载的时候,没有任何问题,一切显示正常。
点父页面查询按钮的时候,控件取到的Stars属性值,通过调试是正常的,但是到了实际用到变量_stars的时候,值都是0,是代码哪里有问题呢,还是哪里需要改进呢?
先谢谢大家了。

解决方案 »

  1.   

    public int Stars
            {
                get { return _stars; }
                set { _stars= value;  }
            }
    没有取回发的值
      

  2.   

    参考:
    http://school.itzcn.com/index.html#
    上面有相关信息,希望对楼主有所帮助。
      

  3.   

     protected void Page_Load(object sender, EventArgs e)
            {
    if(!ispostback){
                    CreateData();
    }
            }
      

  4.   

    if(!ispostback)是特意去掉的,不去掉的话,回发的时候执行不到CreateData方法,我想回发的时候也要执行。现在主要问题是回发的时候取到的属性值不正确。
      

  5.   


    你去掉后,每次回发,int _stars这个值都会重新初始化,默认值是0,所以你就取出来0了嘛
      

  6.   

    .NET默认机制是回发前会记录页面状态,回发的时候把页面状态重新恢复到回发前的,因此想回发的时候也执行CreateData,这个是没有必要的,不用执行你的状态也丢失不了
      

  7.   


    去掉了会造成控件不显示。CreateData方法里有生成五角星和控制五角星的方法。
    还是不太会改。