我创建了一个自定义gridview控件并将其导出到dll中,以便我可以重复使用它。在dll里面我创建了一个获取DataSource的函数,我试图从那里填充一个下拉列表但是失败了。
所以在我的网站上我有这个
public partial class _Management : System.Web.UI.Page
{
public class _ManagementHelper
{
public int ID;
public string CompanyName;
public string ResourceName;
}
protected void Page_Load(object sender, EventArgs e)
{
ucGridViewEx.DataSource = ucGridViewEx_Source();
ucGridViewEx.DataBind();
}
private List<dynamic> ucGridViewEx_Source()
{
var source = dl.ComapniesResources.Select(x => new _ManagementHelper
{
ID = x.ResourceID,
CompanyName = x.Supplier1.SupplierName,
ResourceName = x.Name
});
return ucGridViewEx.GridViewExDataSource(source);
}
然后dll中的自定义控件具有此相关代码
public List<dynamic> GridViewExDataSource<T>(IQueryable<T> query)
{
foreach (var column in this.Columns)
{
var gridViewExColumn = column as ColumnEx;
if (gridViewExColumn != null
&& gridViewExColumn.SearchType == SearchTypeEnum.DropDownList)
{
gridViewExColumn.DropDownDataSource = query.GetDropDownDataSource(gridViewExColumn.DataField);
}
}
return ((IQueryable<dynamic>)query).ToList<dynamic>();
}
函数GetDropDownDataSource()位于与gridview相同的dll内的另一个扩展类中
internal static List<ListItem> GetDropDownDataSource<T>(this IQueryable<T> query,
string dataField)
{
var ddlSource = new List<ListItem>();
// x =>
var xParameter = Expression.Parameter(typeof(T), "x");
// x.Property
var propery = typeof(T).GetProperty(dataField);
// x => x.Property
var columnLambda = Expression.Lambda(Expression.Property(xParameter, propery), xParameter);
return ddlSource;
}
代码在这里我失去了对columnLambda的值,因为属性为null,不是因为它不存在(它确实)因为没有获取任何属性。我尝试使用GetProperties()并且没有返回任何内容。
因为我移动到DataSource以选择_ManagementHelper,所以很奇怪。我之前在ucGridViewEx_Source()上使用动态(Select(x =&gt; new {}))并且它工作得很好。请不要提供继续使用动态的解决方案,因为我需要允许这两种类型,动态和使用自定义对象。
答案 0 :(得分:2)
_ManagementHelper
没有财产。它只包含三个字段(据您所知)。所以GetPrperty
什么都不返回。将_ManagementHelper
的成员更改为属性:
public class _ManagementHelper
{
public int ID { get; set; }
public string CompanyName { get; set; }
public string ResourceName { get; set; }
}
答案 1 :(得分:0)
我看到一个错误 -
var source = dl.ComapniesResources.Select(x => new _ManagementHelper
{
// ResourceID = x.ResourceID, this was the old code
ID = x.ResourceID, // fixed code
CompanyName = x.Supplier1.SupplierName,
ResourceName = x.Name
});
同样,ListItem定义在哪里?