【问题标题】:How do I bind a LINQ query to the row of a gridview?如何将 LINQ 查询绑定到 gridview 的行?
【发布时间】:2011-05-01 14:57:25
【问题描述】:

我需要将 LINQ 查询绑定到 gridview 的行。我正在尝试创建一个类似于 expedia 中的矩阵的表格,其中在不同的行上有不间断、1 个停靠点和 2 个停靠点。我不太确定如何将查询绑定到 gridview 行。感谢您的帮助。

    var imgquery = from f in XElement.Load(MapPath("flightdata3.xml")).Elements("flight")
                   orderby Convert.ToInt32(f.Element("price").Value)
                   select new
                   {
                       ImagePath = (string)f.Element("airlineimageurl").Value
                   };


    //query for gvMatrix where numberofstops=0
    var numstops0query = from f in XElement.Load(MapPath("flightdata3.xml")).Elements("flight")
                where Convert.ToInt32(f.Element("numberofstops").Value) == 0
                orderby Convert.ToInt32(f.Element("price").Value)
                select new
                {
                    Price = "$" + (Int32)f.Element("price"),
                    ImagePath = (string)f.Element("airlineimageurl").Value
                };

    <asp:GridView ID="gvMatrix" runat="server">
    </asp:GridView>

【问题讨论】:

  • 你的意思是每一行都要绑定不同的数据集吗?
  • 请提供一些代码示例说明您正在尝试做什么
  • 我的意思是每一行都会绑定到不同的查询。这有意义吗?每行会有不同的 where 条件,例如 where nonstop=0, nonstop=1, nonstop=2
  • 请提供一些代码以便我们为您提供帮助。
  • 我将我的代码添加到原始帖子中。

标签: c# asp.net linq linq-to-objects


【解决方案1】:

我相信您需要从 GridView RowDataBound 事件中调用辅助查询,然后手动填充辅助值字段:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

但是,您似乎可以在 SQL 连接或子选择中获得您要查找的内容。如果您使用的是 SQL 数据源,我会使用 SQL 来查看是否可以在单个 Select 语句中获取数据,然后返回查看是否可以将 SQL 查询转换为适当的 LINQ——或者我可能会调用它通过存储过程。但是,如果您致力于 LINQ,或者如果连接或子选择不起作用,那么 RowDataBound 是您的最佳选择。

【讨论】:

  • 嗨,我正在考虑使用 RowDataBound。我去了那个链接,但仍然不确定如何将 LINQ 查询绑定到 RowDataBound 事件
  • 您确实无法“绑定”查询。您手动执行它并将值放入网格行中。当为每一行触发 RowDataboundEvent 时,您将需要获取标识当前行/参数所需的行值,然后执行 LINQ 查询以检索特定于行的结果。最后,您使用显示的语法 (e.Rows.Cells) 将结果放置在适当的列中。这是一个更深入的例子。它没有对每一行进行查询,但它显示了其他操作。 simple-talk.com/dotnet/asp.net/…
【解决方案2】:

我不确定,Grid View 是否会为您提供所需的功能,因为数据集将绑定到整个网格。您可以在运行时创建 HTMl 表结构,并且在您创建的每一行上,您都可以控制它来绑定您拥有的任何 linq 数据。希望对你有帮助:)

placeHolder.Controls.Clear(); //asp:placeholder holds the table structure.
Table table = new Table();
table.ID = "table";
placeHolder.Controls.Add(table); //adding to place holder

TableRow row = new TableRow();
row.ID ="rowID";
table.Rows.Add(row); //creating first row for first linq dataset

var nonstop0query = from x in obj select new {x.ID, x.Name, x.Age}; //first linq dataset.

//Creating cells for the data returned by the nonstop0query
TableCell cell = new TableCell();
cell.ID = "cell1";
row.Cells.Add(cell);
cell.Text = nonstop0Query[0];

cell = new TableCell();
cell.ID = "cell2";
row.Cells.Add(cell);
cell.Text = nonstop0Query[1];

cell.ID = "cell3";
row.Cells.Add(cell);
cell.Text = nonstop0Query[2];

//Same way can be done for more dataset to bind to row. 

【讨论】:

  • 仍然不知道该怎么做。你能给我一些示例代码吗?
  • 嗨,我遇到了代码行问题:cell.Text = nonstop0Query[0];
  • 我只是代表返回的属性,即 id、name 和 age。如果你得到 nonstop0query count > 1 那么你将不得不迭代它,否则你可以做 nonstop0query.ID 等等......这段代码只是伪代码。 :)
猜你喜欢
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2011-08-27
相关资源
最近更新 更多