0

カスタム 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 {}) ) を使用していましたが、完全に機能しました。動的オブジェクトとカスタム オブジェクトの両方のタイプを許可する必要があるため、動的オブジェクトを使用し続けるための解決策を提供しないでください。

4

2 に答える 2

2

_ManagementHelperプロパティはありません。3つのフィールドしか含まれていません(あなたが私たちに言った限り)。したがって、GetPrperty何も返しません。のメンバー_ManagementHelperを次のプロパティに変更します。

public class _ManagementHelper
{
    public int ID { get; set; }
    public string CompanyName { get; set; }
    public string ResourceName { get; set; }
}
于 2013-03-01T04:52:23.823 に答える
0

バグが 1 つあります -

    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 はどこで定義されていますか?

于 2013-03-01T04:24:39.433 に答える