我有一个用户控件(不想创建自定义控件)在这个控件中我有一个列表框。 现在我想使用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'类型的对象。”
答案 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;
}
}