【发布时间】:2011-01-25 00:45:42
【问题描述】:
使用 Linq-to-SQL 和动态数据。
在动态数据编辑屏幕上,下拉列表列出了外键的可能值。
我需要过滤此下拉列表中列出的值,最好在 linq-to-sql 查询中添加 where 子句。
有什么想法吗?
【问题讨论】:
标签: .net linq-to-sql dynamic-data
使用 Linq-to-SQL 和动态数据。
在动态数据编辑屏幕上,下拉列表列出了外键的可能值。
我需要过滤此下拉列表中列出的值,最好在 linq-to-sql 查询中添加 where 子句。
有什么想法吗?
【问题讨论】:
标签: .net linq-to-sql dynamic-data
我将构建一个作为 Web 用户控件的自定义字段模板,并使用 UIHintAttribute 在元数据中引用它。注意:您必须构建一个标准版本(通常是超链接)和一个 _Edit 版本(通常是下拉菜单)。
【讨论】:
我想你已经解决了你的问题,但我想注册我的解决方案,以防万一它可以帮助别人!
我按照你建议的路径,编辑 ForeignKey_Edit.ascx.cs。在 PopulateListControl(DropDownList1) 行之后,我调用了一个方法 RemoveResultsFromOtherUsers()。
方法如下:
private void RemoveResultsFromOtherUsers()
{
using (var db = new FinWeb3.DynamicData.FinWebDBDataContext())
{
var data = db.GetTable(this.Column.Provider.ColumnType);
var removableItems = new List<ListItem>();
foreach (var item in data)
{
var dbItem = item as IDbEntity;
if (dbItem.UserName != this.Context.User.Identity.Name)
{
removableItems.Add(
DropDownList1.Items.FindByValue(dbItem.Id.ToString()));
}
}
foreach (var item in removableItems)
{
DropDownList1.Items.Remove(item);
}
}
}
IDbEntity 是我所有的 linq to sql 类都实现的接口。此接口具有属性 Id 和 UserName。在这里,我的意图是删除当前经过身份验证的用户未注册的结果。
感谢您的问题和解决方案!
【讨论】:
好吧,我找到了一个地方来定制这个,虽然我还没有找到一种方法来覆盖或扩展 linq 查询以加载数据:
在文件 \DynamicData\FieldTemplates\ForeignKey_Edit.ascx.cs(根据默认位置)中,在 Page_Load 方法中进行以下调用:
PopulateListControl(DropDownList1);
这可以完全替换为您自己的代码。 就我而言,我首先检查了当前表是否实现了我定义的自定义接口。 如果是,则使用它来获取绑定下拉列表的数据,否则将控制权传递给 PopulateListControl。
使用 Reflector,看来 PopulateListControl 最终使用 MetaTable.GetQuery() 来获取表的默认列表查询。 本来会很好,而不是……但现在继续做其他事情!
【讨论】: