是否可以在GridView(ASP.NET)上执行linq查询?

时间:2010-09-13 13:46:10

标签: asp.net linq gridview

基本上我有一个数据键,我想从我的GridView查询,而不是循环遍历所有行并比较每行的键。所以我想知道是否可以在gridview(不是数据表)上执行linq查询并使用datakey进行过滤。

4 个答案:

答案 0 :(得分:3)

不确定如何直接使用DataKeyNames,因为Column没有关于它来自的数据字段名称的任何信息。在下面的示例中,我使用SortExpression获取用于过滤的列索引。

编辑:这里最重要的部分是强制转换,它使您能够使用为IEnumerable< T>设计的所有花哨的扩展方法。

int idColumnIndex = MyGrid.Columns.Cast<DataControlField>().Where(e => e.SortExpression == "ID").Select(e => MyGrid.Columns.IndexOf(e)).FirstOrDefault();
var row = MyGrid.Rows.Cast<GridViewRow>().Where(e => e.Cells[idColumnIndex].Text == "421").FirstOrDefault();

一切皆有可能!

答案 1 :(得分:1)

Gridview本身就不算什么。它只是一个用户界面,数据源自数据表或数据集,您可以使用linq查询它们。

答案 2 :(得分:1)

据我理解LINQ的理论,它可以在任何列表上执行。由于gridview中的数据源本质上是一个列表,因此您应该能够在gridview的数据源上使用LINQ。

试试这个例子:

http://weblogs.asp.net/scottgu/archive/2006/05/14/Using-LINQ-with-ASP.NET-_2800_Part-1_2900_.aspx

答案 3 :(得分:0)

我用转发器做了类似的事情,也许它会有所帮助......或者你可以忽略它,如果它没有。在我的情况下,我对转发器进行了数据处理,并允许用户在将数据导出到XML之前修改数据。以下LINQ遍历转发器中的每一行,使用findcontrol从数据行中获取控件,然后使用Linq转换为XML,但这可以用于使用LINQ to Objects生成对象。 rp是转发器,cbIgnore是一个复选框,如果用户检查它,则该行未被删除。

    Dim doc As New XDocument( _
        New XDeclaration("1.0", "ISO-8859-1", "true"), _
        New XElement("Schedule_Import", _
                     From c As RepeaterItem In rp.Items _
                     Where (c.ItemType = ListItemType.Item Or c.ItemType = ListItemType.AlternatingItem) _
                     AndAlso DirectCast(c.FindControl("cbIgnore"), HtmlInputCheckBox).Checked = False _
                     Select New XElement("activity", _
                                         New XElement("code", DirectCast(c.FindControl("txtAC"), TextBox).Text), _
                                         New XElement("starttime", DirectCast(c.FindControl("dtfStart"), DateTimeField).SelectedDateTime), _
                                         New XElement("endtime", DirectCast(c.FindControl("dtfEnd"), DateTimeField).SelectedDateTime), _
                                         New XElement("description", DirectCast(c.FindControl("txtTitle"), TextBox).Text))))