使用Linq-to-SQL和动态数据。
在动态数据编辑屏幕上,下拉列表列出了外键的可能值。
我需要过滤此下拉列表中列出的值,最好是在linq-to-sql查询中添加where子句。
有什么想法吗?
答案 0 :(得分:5)
好吧,我找到了一个自定义的地方,虽然我还没有找到覆盖或扩展linq查询来加载数据的方法:
在文件\ DynamicData \ FieldTemplates \ ForeignKey_Edit.ascx.cs中(根据默认位置),在Page_Load方法中进行以下调用:
PopulateListControl(DropDownList1);
这可以完全用您自己的代码替换。 在我的例子中,我首先检查当前表是否实现了我定义的自定义接口。 如果是,请使用它来获取数据以绑定下拉列表,否则将控制权传递给PopulateListControl。
使用Reflector,似乎PopulateListControl最终使用MetaTable.GetQuery()来获取表的默认列表查询。 本来可以很好地反过来..但现在转向其他事情!
答案 1 :(得分:4)
我认为你已经解决了你的问题,但我想注册我的解决方案,以防万一它可以帮助别人!
我按照你的路径,编辑了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属性。在这里,我的目的是删除当前经过身份验证的用户未注册的结果。
感谢您的提问和解决方案!
答案 2 :(得分:0)
我将构建一个自定义字段模板,该模板是一个Web用户控件,并使用UIHintAttribute在元数据中引用它。注意:您必须构建标准版本(通常是超链接)和_Edit版本(通常是下拉列表)。