カスタム 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() は、グリッドビューと同じ 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;
}
プロパティを取得していないため存在しない (存在する) ためではなく、プロパティが null であるため、columnLambda に値を割り当てているコードが失敗します。GetProperties() を試しましたが、何も返されません。
_ManagementHelper を選択するために DataSource に移動したので、これが起こっているよりも興味があります。以前は ucGridViewEx_Source() で動的 ( Select(x => new {}) ) を使用していましたが、完全に機能しました。動的オブジェクトとカスタム オブジェクトの両方のタイプを許可する必要があるため、動的オブジェクトを使用し続けるための解決策を提供しないでください。