如何设置用户控件的in.aspx文件的DataSource属性?

时间:2011-07-12 04:48:16

标签: .net asp.net user-controls

我有一个用户控件(不想创建自定义控件)在这个控件中我有一个列表框。 现在我想使用Datasource属性,它可以用作此列表框的数据源。

<UC:CustomList ID="list" CustomDataSource="objectDataSource1" runat="server" />

在控制中:

 public object CustomDataSource
    {
        get
        {
            return this.checkComboBox.DataSourceID;
        }

        set
        {
            this.checkComboBox.DataSource = value;
        }            
    }

它给出运行时错误“无法从'CustomDataSource'属性的字符串表示'objectDataSource1'创建'System.Object'类型的对象。”

3 个答案:

答案 0 :(得分:2)

Justin指出,正确的实施将是

 public object CustomDataSource
 {
        get
        {
            return this.checkComboBox.DataSource;
        }

        set
        {
            this.checkComboBox.DataSource = value;
        }            
 }

Imp:此外,请确保无论您在何处设置此属性,都 分配ToString实际数据源(您必须这样做)为了早期版本工作)。

编辑: 从您的评论中,您需要的是DataSourceID属性,即

public string CustomDataSourceID
     {
            get
            {
                return this.checkComboBox.DataSourceID;
            }

            set
            {
                this.checkComboBox.DataSourceID = value;
            }            
     }

现在,您可以在标记中使用此属性以声明方式关联数据源ID。

答案 1 :(得分:0)

将您的代码更改为

public object CustomDataSource //<<<Changed to object from string
{
    get
    {
        return this.checkComboBox.DataSourceID;
    }

    set
    {
        this.checkComboBox.DataSource = value;
    }            
}

在您的代码中也提到了以下内容。

<uc1:lstControl id="lstControl1" runat="server" enabled="true"  CustomDataSource="datasourceName"/>

答案 2 :(得分:0)

在重新解释你的问题后,我想我明白你的要求。

由于您使用的是ObjectDataSource的ID,因此您需要找到该控件并获取SelectMethod属性。然后,您需要调用该方法以获取要呈现的数据。这是你真的不想做的事情,因为它会导致更多的问题,比如因为Page.Controls在那个阶段没有填充而无法在代码前端设置CustomDataSource属性所以你找不到ObjectDataSource控制。但是,您可以在Page_Load中设置代码中的属性。

以下是您可以执行此操作的示例:

Usercontrol的代码:

public partial class MyUserControl : System.Web.UI.UserControl
{
    private string customDataSource;
    public string CustomDataSource
    {
        get { return customDataSource; }
        set
        {
            customDataSource = value;
            var ctrl = (ObjectDataSource) this.Page.FindControlRecursive(customDataSource);
            if (ctrl == null) return;

            var m = this.Page.GetType().GetMethod(ctrl.SelectMethod);
            if (m == null) return;

            var data = m.Invoke(this.Page, BindingFlags.InvokeMethod | BindingFlags.Public, null, null, null);

            checkComboBox.DataSource = data;
            checkComboBox.DataBind();
        }
    }
}

使用Usercontrol页面的代码隐藏:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            myCtrl.CustomDataSource = "objectDataSource1";
    }

    public object GetData()
    {
        return new List<string> { "1", "2", "3" };
    }
}

在页面的某个位置,您正在使用以下内容插入Usercontrol:

<uc:MyUserControl runat="server" id="myCtrl"></uc:MyUserControl>

当然还有ObjectDataSource:

<asp:ObjectDataSource runat="server" ID="objectDataSource1" SelectMethod="GetData"></asp:ObjectDataSource>

FindControlRecursive是一个简单的扩展方法:

public static class ExtensionMethods
{
    public static Control FindControlRecursive(this Control control, string id)
    {
        if (control == null) return null;
        if (control.ID == id) return control;

        foreach (Control c in control.Controls)
        {
            var found = FindControlRecursive(c, id);
            if (found != null) return found;
        }

        return null;
    }
}