2015-07-17 5 views
9

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

+0

Каждая строка в новом столбце должна содержать то же значение jd.DbriefedByUser. Я прав ? – Disappointed

+0

Кажется, нет причин, чтобы помочь вам, если вы не ответите на вопросы о разъяснении. – Disappointed

ответ

0

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

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

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

0

Я думаю, что ваш лучший способ - использовать 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 
    }; 
0

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

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

4

Самый простой answar будет создать новый DataTable и присвоить все значения в нем

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(); 
Смежные вопросы