Как иметь столбцы на GridView с различными источниками данных?

Я пытаюсь динамически создать 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();

Я создал GridView в функции BuildGrid, которая находится в классе job_piece.

    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; его не найти информацию. Можно ли установить для пользовательского столбца другой источник данных?

4 ответа

Самый простой ответ - создать новую таблицу данных и присвоить ей все значения.

  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();

Вы можете создать класс-оболочку, чтобы обернуть другие классы, данные которых должны быть связаны с сеткой. А затем привяжите сетку к этому классу оболочки.

Класс-обертка будет иметь оба других класса в качестве дочерних элементов и будет предоставлять элементы данных из обоих классов, которые необходимо связать с сеткой.

Я думаю, что ваш лучший способ - это использовать Linq. Свяжите свои объекты общим полем, таким как поле идентификатора. Теперь, когда данные связаны друг с другом, вы можете отобразить столбец 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 вашей сетки. Когда он создает вашу строку, проверьте идентификатор в вашей сетке, если он равен идентификатору столбца, который вы хотите, затем установите столбец равным пользователю.

--jb.Peices.ID =  jb.JobDebrief.ID

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

Если у вас есть список (перечислимый), вы можете использовать сценарий на основе соединения. Если один на один, то присоединиться или еще присоединиться к группе.

Это сгенерирует единый список источников данных и будет легко связывать или извлекать данные с сервера базы данных, а также может использовать объединение на сервере базы данных.

Технически я не думаю, что мы можем связать несколько источников данных с простой сеткой (за исключением древовидного представления и родительского дочернего представления). Сетка отображает данные в формате строки, поэтому для генерации одной строки необходим один объект или объект в коллекции. Если вы предоставляете два источника данных, между ними должно быть отношение. Например:- у первого есть 10 строк, а у второго 20, тогда как может отображаться сетка строк? Поэтому для всего этого необходимо использовать отношения и создать единое представление. это может быть отображено в сетке.

Другие вопросы по тегам