【问题标题】:how to have columns on GridView with different data sources?如何在 GridView 上有不同数据源的列?
【发布时间】:2015-10-07 01:28:03
【问题描述】:

我正在尝试动态创建一个 GridView。其中一列是创建该行的用户。

JobDebrief jd = new JobDebrief(JobID);
Job jb = new Job(JobID);
DataGrid db = JobClass.Job_Piece.BuildGrid();
db.Columns.Add(CreateBoundColumn(jd.DbriefedByUser, "User"));
PlaceHolder.Controls.Add(db);
db.DataSource = jb.Pieces;
db.DataBind();

我在 Job_piece 类中的 BuildGrid 函数中创建了 GridView。

    public static DataGrid BuildGrid()
    {
          DataGrid NewDg = new DataGrid();

          NewDg.DataKeyField = "ID";
          NewDg.AutoGenerateColumns = false;
          NewDg.CssClass = "tblResults";
          NewDg.HeaderStyle.CssClass = "tblResultsHeader";
          NewDg.AlternatingItemStyle.CssClass = "ResultsStyleAlt";
          NewDg.ItemStyle.CssClass = "ResultsStyle";

          NewDg.Columns.Add(Load.CreateBoundColumn("AdvisedQty", "Qty Advised"));
          NewDg.Columns.Add(Load.CreateBoundColumn("PieceTypeString", "Piece Type"));
          NewDg.Columns.Add(Load.CreateBoundColumn("ReceivedQty", "Rcvd Qty"));          

          NewDg.Width = Unit.Percentage(100.00);

          return NewDg;
    }

public static BoundColumn CreateBoundColumn(string DataField, string Header,string CssClass ="",bool Highlight = false)
    {
        BoundColumn column = new BoundColumn();
        column.DataField = DataField;
        column.HeaderText = Header;
        column.SortExpression = DataField;

        if (Highlight)
        {
            column.ItemStyle.CssClass = "ColumnHighlight";
        }

        if (!string.IsNullOrEmpty(CssClass))
        {
            column.ItemStyle.CssClass = CssClass;
        }
        return column;
    }

它当前显示的 3 列都来自 job_piece。由于用户不属于此类,因此我尝试在此函数之外创建列。

该列显示标题,但行为空白。用户名来自JobDebrief 类。但由于我将 GridView 绑定到各个部分,db.DataSource = jb.Pieces; 它没有找到信息。是否可以将用户列设置为不同的数据源?

【问题讨论】:

  • 新列中的每一行都应包含相同的值 jd.DbriefedByUser。我说的对吗?
  • 如果您不回答澄清问题,似乎没有理由帮助您。

标签: c# asp.net gridview datasource databound


【解决方案1】:

最简单的答案是 创建一个新的数据表并为其分配所有值

  DataTable dt= jb.Pieces.CopyToDataTable();
  dt.Columns.Add("UserId")
  for(int i=0;i<dt.Rows.Count;i++)
  {
        dt.Rows[i]=//Your info
  }
  db.DataSource = dt;
  db.DataBind();

【讨论】:

    【解决方案2】:

    如果您有列表(可枚举),您可以使用基于 join 的场景。如果是一对一,则加入或组加入。

    这将生成一个单一的数据源列表,并且很容易从数据库服务器绑定或检索数据,然后也可以在数据库服务器上使用连接。

    从技术上讲,我不认为我们可以将多个数据源绑定到简单的网格(树视图和父子视图除外)。网格以行格式显示数据,因此要生成单行需要集合中的单个对象或实体。如果您提供两个数据源,则两者之间必须存在关系。例如:- 第一个有 10 行,第二个有 20 行,那么行网格应该如何显示?因此,对于所有这些都需要使用关系并创建单个视图。可以在网格中显示。

    【讨论】:

      【解决方案3】:

      我认为你最好的方法是使用 Linq。通过一个公共字段(例如 ID 字段)将您的对象联系在一起。现在数据已链接在一起,您可以显示 User 列,它将位于您的对象中。

      创建您的网格。

        <asp:GridView ID="NewDg" runat="server"  width="100%" AllowPaging="True" AlternatingRowStyle-CssClass="ResultsStyleAlt" AutoGenerateColumns="False" CssClass="tblResults" DataKeyNames="ID" EmptyDataText="No records Found" HeaderStyle-CssClass="tblResultsHeader" pagesize="10" RowStyle-CssClass="ResultsStyle" ShowFooter="False">
                          <Columns>
                              <asp:BoundField DataField="ID" HeaderText="LookUpID" ItemStyle-HorizontalAlign="Left" Visible="false" />
                              <asp:BoundField DataField="AdvisedQty" HeaderStyle-Width="250px" HeaderText="Qty Advised" ReadOnly="true" SortExpression="AdvisedQty" />
                              <asp:BoundField DataField="PieceTypeString" HeaderStyle-Width="150px" HeaderText="Piece Type" ItemStyle-HorizontalAlign="Left" ReadOnly="true" SortExpression="PieceTypeString" />
                              <asp:BoundField DataField="ReceivedQty" HeaderStyle-Width="150px" HeaderText="Rcvd Qty" ReadOnly="true" SortExpression="ReceivedQty" />
                              <asp:BoundField DataField="User" HeaderStyle-Width="150px" HeaderText="User" ReadOnly="true" SortExpression="User" />
                          </Columns>
                      </asp:GridView>
      

      页面加载时或您想要加载网格时的 Linq 代码

         var combinedResults = (from p in jb.Peices
                 join o in jb.JobDebrief
                    on p.ID equals o.ID
                        select new
                        {p.AdvisedQty,
                         p.PieceTypeString,
                         p.ReceivedQty
                         o.User});
      
      NewDg.Datasource = combinedResults.ToList;
      NewDg.Databind();
      

      如果由于某种原因无法组合对象,您可以考虑的另一件事是使用网格的 RowDataBound 方法。当它创建您的行时,检查网格中的 ID 是否等于您想要的列的 ID,然后将该列设置为等于用户。

      --jb.Peices.ID =  jb.JobDebrief.ID
      
         if (e.Row.DataItem.ID == ID)
          {
              e.Row.Cells(4)==jb.JobDebrief.User
          };
      

      【讨论】:

        【解决方案4】:

        您可以创建一个包装类来包装其他需要将数据绑定到网格的类。然后将网格绑定到这个包装类。

        包装类将其他两个类都作为子成员,并将公开需要绑定到网格的两个类的数据成员。

        【讨论】:

          猜你喜欢
          • 2017-12-11
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-21
          • 2013-10-15
          • 1970-01-01
          相关资源
          最近更新 更多