none
MultiList 的dataSource Datatable 类型转成 ICollection 类型的问题 RRS feed

  • 问题

  •         /// <summary>
            /// 将ataSource转换成指定的Items
            /// </summary>
            /// <param name="view"></param>
            protected void PerformanceData(MultiListItem listItem)
            {
                object dataSource = listItem.DataSource;
                if (dataSource != null)
                {
                    bool flag_display = false;
                    bool flag_format = false;
    
                    string propName = this.DataTextField;
                    string dataValueField = this.DataValueField;
                    string format = this.DataTextFormatString;
    
                    //问题就在此,data为空,但是dataSource是有值的,
                    ICollection data = dataSource as ICollection;
                    if (data != null)
                    {
                        listItem.Items.Capacity = listItem.Items.Count + data.Count;
                    }
                    if (propName.Length != 0 || dataValueField.Length != 0)
                        flag_display = true;
                    if (this.DataTextFormatString.Length!= 0)
                        flag_format = true;
                    foreach (object obj in data)
                    {
                        ListItem item = new ListItem();
                        //自定义显示TextField,ValueField
                        if (flag_display)
                        {
                            if (propName.Length > 0)
                            {
                                item.Text = (string)DataBinder.GetPropertyValue(obj, propName);
                            }
                            if (dataValueField.Length > 0)
                            {
                                item.Value =(string) DataBinder.GetPropertyValue(obj, dataValueField);
                            }
                        }
                        else
                        {
                            if (flag_format)
                            {
                                item.Text = string.Format(CultureInfo.CurrentCulture, format, new object[] { obj });
                            }
                            else
                            {
                                item.Text = obj.ToString();
                            }
                        }
                        listItem.Items.Add(item);
                    }
                }
            }
    

    我就想问 ICollection data = dataSource as ICollection;
    这句是不是有什么解决办法,可以使data可以取到值

    2011年10月25日 1:08

答案

  • object dataSource = listItem.DataSource;
    是取到控件的数据源,MultiListItem listItem 是自定义控件,listItem.DataSource是我已经绑定的数据源


    既然是自定义控件,请确认你的DataSource在PostBack数据回发的时候是不是还是保存原有的内容呢?根据我的现有知识了解,似乎类似数据绑定控件(手动绑定)之后,类似GridView什么的DataSource就无法再次取到内容了。

    尝试解决办法,如果你的绑定的DataSource是支持序列化的,那么请务必放入ViewState中,以便回发之后继续可以取到。例如你的属性应该这样定义——

    public property object DataSource

    {

        get

        {

               return ViewState["source"]==null?null:ViewState["source"];

        }

       set

        {

              ViewState["source"] = value;

        }

    }

    不能直接把value给某一个值进行赋值操作,因为根据asp.net 机制,每一个服务端控件在回发以后都会生成新实例的,所以无法保存原有的内容。必须通过ViewState进行数据记忆。

    另外一个办法是你把可以序列化的DataSource赋的“值”保存到ViewState或者Session中,以便直接对其操作,不过请注意同步性问题(保证ViewState或者Session的内容和数据绑定控件listItem是一样的,建议在更新数据之后重新读取数据覆盖原来的ViewState或者Session中的数据)。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    • 已标记为答案 Paul Zhou 2011年11月1日 7:02
    2011年10月25日 2:01
    版主

全部回复

  • object dataSource = listItem.DataSource;
    是取到控件的数据源,MultiListItem listItem 是自定义控件,listItem.DataSource是我已经绑定的数据源
    2011年10月25日 1:10
  • object dataSource = listItem.DataSource;
    是取到控件的数据源,MultiListItem listItem 是自定义控件,listItem.DataSource是我已经绑定的数据源


    既然是自定义控件,请确认你的DataSource在PostBack数据回发的时候是不是还是保存原有的内容呢?根据我的现有知识了解,似乎类似数据绑定控件(手动绑定)之后,类似GridView什么的DataSource就无法再次取到内容了。

    尝试解决办法,如果你的绑定的DataSource是支持序列化的,那么请务必放入ViewState中,以便回发之后继续可以取到。例如你的属性应该这样定义——

    public property object DataSource

    {

        get

        {

               return ViewState["source"]==null?null:ViewState["source"];

        }

       set

        {

              ViewState["source"] = value;

        }

    }

    不能直接把value给某一个值进行赋值操作,因为根据asp.net 机制,每一个服务端控件在回发以后都会生成新实例的,所以无法保存原有的内容。必须通过ViewState进行数据记忆。

    另外一个办法是你把可以序列化的DataSource赋的“值”保存到ViewState或者Session中,以便直接对其操作,不过请注意同步性问题(保证ViewState或者Session的内容和数据绑定控件listItem是一样的,建议在更新数据之后重新读取数据覆盖原来的ViewState或者Session中的数据)。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    • 已标记为答案 Paul Zhou 2011年11月1日 7:02
    2011年10月25日 2:01
    版主