ASP.NET动态数据过滤


無口君
2025-02-07 10:09:56 (24天前)
  1. )。

我检查了ASP.NET动态

数据
</跨度>

过滤
</跨度>
http://dynamicdatafiltering.codeplex.com/),但似乎没有为4.0维护。

我想我有两个问题:

有没有办法做到这一点(让我的列可过滤)?
是动态的

数据
</跨度>
实际上适合在现实世界中使用?

  1. 我想使用ASP.NET动态


数据
</跨度>
4.0使用EF POCO ObjectContext作为系统管理员的简单实体管理控制台(我正在考虑放弃这项技术……)。

我有

2 条回复
  1. 0# 我头上有犄角 | 2019-08-31 10-32



    沮丧并采取直接的路线。如果没有更好的解决方案……好吧,那么微软在这方面做得很差:




    1. public class QueryableFilterRepeater : System.Web.DynamicData.QueryableFilterRepeater
      {
      private static readonly FieldInfo FiltersField = typeof(System.Web.DynamicData.QueryableFilterRepeater).GetField(“_filters”, BindingFlags.Instance | BindingFlags.NonPublic);
      private static readonly FieldInfo DataSourceField = typeof(System.Web.DynamicData.QueryableFilterRepeater).GetField(“_dataSource”, BindingFlags.Instance | BindingFlags.NonPublic);
      private static readonly MethodInfo FilterInitializeMethod = typeof(DynamicFilter).GetMethod(“Initialize”, BindingFlags.Instance | BindingFlags.NonPublic);
      private static readonly PropertyInfo FilterContextProperty = typeof(DynamicFilter).GetProperty(“Context”, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
      private static readonly MethodInfo PageInitCompleteMethod = typeof(System.Web.DynamicData.QueryableFilterRepeater).GetMethod(“Page_InitComplete”, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
      private static readonly EventInfo InitCompleteEvent = typeof(Page).GetEvent(“InitComplete”);

    2.     private readonly List<DynamicFilter> filters;
    3.     private int filterCount;
    4.     private bool initialized;
    5.     public IEnumerable<DynamicFilter> Filters
    6.     {
    7.         get { return filters; }
    8.     }
    9.     public QueryableFilterRepeater()
    10.     {
    11.         filters = (List<DynamicFilter>)FiltersField.GetValue(this);
    12.     }
    13.     private IQueryableDataSource DataSource
    14.     {
    15.         get { return DataSourceField.GetValue(this) as IQueryableDataSource; }
    16.     }
    17.     protected override void OnInit(EventArgs e)
    18.     {
    19.         base.OnInit(e);
    20.         InitCompleteEvent.RemoveEventHandler(Page, Delegate.CreateDelegate(typeof(EventHandler), this, PageInitCompleteMethod));
    21.         Page.InitComplete += new EventHandler(Page_InitComplete);
    22.     }
    23.     protected override void OnLoad(EventArgs e)
    24.     {
    25.         filters.Select((f, i) => new { f, i }).Where(x => x.i > filterCount - 1).ToList().ForEach(x => filters.Remove(x.f));
    26.         Controls.OfType<Control>().Select((c, i) => new { c, i }).Where(x => x.i > filterCount - 1).ToList().ForEach(x => Controls.Remove(x.c));
    27.         base.OnLoad(e);
    28.     }
    29.     private void Page_InitComplete(object sender, EventArgs e)
    30.     {
    31.         if (!initialized)
    32.         {
    33.             Controls.Clear();
    34.             filters.Clear();
    35.             MetaTable metaTable = DataSource.GetMetaTable();
    36.             int num = 0;
    37.             foreach (MetaColumn column in metaTable.Columns)
    38.             {
    39.                 string filterUIHint = GetFilterUIHint(column);
    40.                 if (filterUIHint == null) continue;
    41.                 var filterRepeaterItem = new FilterRepeaterItem();
    42.                 filterRepeaterItem.DataItemIndex = num;
    43.                 filterRepeaterItem.DisplayIndex = num;
    44.                 FilterRepeaterItem container = filterRepeaterItem;
    45.                 num++;
    46.                 ItemTemplate.InstantiateIn(container);
    47.                 Controls.Add(container);
    48.                 var dynamicFilter = container.FindControl(DynamicFilterContainerId) as DynamicFilter;
    49.                 if (dynamicFilter == null)
    50.                 {
    51.                     throw new InvalidOperationException();
    52.                 }
    53.                 FilterContextProperty.SetValue(dynamicFilter, new HttpContextWrapper(Context), null);
    54.                 dynamicFilter.DataField = column.Name;
    55.                 container.DataItem = column;
    56.                 container.DataBind();
    57.                 container.DataItem = null;
    58.                 dynamicFilter.FilterUIHint = filterUIHint;
    59.                 filters.Add(dynamicFilter);
    60.                 filterCount++;
    61.             }
    62.             filters.ForEach(f => FilterInitializeMethod.Invoke(f, new[] { DataSource }));
    63.             initialized = true;
    64.         }
    65.     }
    66.     private string GetFilterUIHint(MetaColumn column)
    67.     {
    68.         if (GetUnderlyingType(column.ColumnType) == typeof(string))
    69.         {
    70.             return "String";
    71.         }
    72.         if (GetUnderlyingType(column.ColumnType) == typeof(bool))
    73.         {
    74.             return "Boolean";
    75.         }
    76.         if (GetUnderlyingType(column.ColumnType).IsEnum)
    77.         {
    78.             return "Enumeration";
    79.         }
    80.         if (GetUnderlyingType(column.ColumnType) == typeof(DateTime))
    81.         {
    82.             return "DateTime";
    83.         }
    84.         if (column is MetaForeignKeyColumn)
    85.         {
    86.             return "ForeignKey";
    87.         }
    88.         if (column is MetaChildrenColumn)
    89.         {
    90.             return "Children";
    91.         }
    92.         return null;
    93.     }
    94.     private Type GetUnderlyingType(Type type)
    95.     {
    96.         return Nullable.GetUnderlyingType(type) ?? type;
    97.     }
    98.     // Nested Types
    99.     #region Nested type: FilterRepeaterItem
    100.     private class FilterRepeaterItem : Control, IDataItemContainer
    101.     {
    102.         // Properties
    103.         #region IDataItemContainer Members
    104.         public object DataItem { get; internal set; }
    105.         public int DataItemIndex { get; internal set; }
    106.         public int DisplayIndex { get; internal set; }
    107.         #endregion
    108.     }
    109.     #endregion
    110. }
    111. </code>

登录 后才能参与评论