2015-07-17 12 views
9

Sto provando a creare dinamicamente un GridView. Una delle colonne è l'utente che ha creato la riga.come disporre di colonne su GridView con diverse origini dati?

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

Ho creato il GridView nella funzione BuildGrid che si trova nella classe 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; 
    } 

Le 3 colonne attualmente visualizzate vengono tutte da job_piece. Poiché l'utente non appartiene a questa classe, ho cercato di creare la colonna al di fuori di questa funzione.

La colonna visualizza l'intestazione ma le righe sono vuote. Il nome utente viene dalla classe JobDebrief. Ma dal momento che sto legando GridView ai pezzi, db.DataSource = jb.Pieces; non trova le informazioni. È possibile impostare la colonna utente su un diverso DataSource?

+0

Ogni riga nuova colonna deve contenere lo stesso valore jd.DbriefedByUser. Ho ragione ? – Disappointed

+0

sembra che non ci siano motivi per aiutarti se non rispondi alle domande di chiarimento. – Disappointed

risposta

0

Se si dispone di un elenco (enumerabile) è possibile utilizzare lo scenario join. Se uno a uno si uniscono o si uniscono al gruppo.

Questo genererà un singolo elenco di origini dati e sarà facile da associare o Recupero di dati dal server di database quindi anche possibile utilizzare join sul server di database.

Tecnicamente non penso che sia possibile associare più origini dati a una griglia semplice (eccetto visualizzazione ad albero e vista padre figlio). La griglia visualizza i dati nel formato riga, quindi per generare la singola riga richiede un singolo oggetto o entità nella raccolta. Se fornisci due fonti di dati, deve esserci una relazione tra entrambi. Ad esempio: - prima ha una riga di 10 e la seconda ha un 20, quindi come può essere visualizzata la griglia delle righe ?. Quindi per tutto ciò è necessario utilizzare la relazione e creare un'unica vista. che può essere visualizzato in griglia.

0

Penso che il tuo metodo migliore sia usare Linq. Lega insieme i tuoi oggetti con un campo comune come un campo ID. Ora che i dati sono collegati insieme, puoi visualizzare la colonna User che sarà ora nel tuo oggetto.

Crea la tua griglia.

<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> 

codice Linq al caricamento della pagina o quando si desidera caricare griglia

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

Se non è possibile combinare gli oggetti per qualche ragione un'altra cosa che si potrebbe prendere in considerazione è utilizzare il metodo RowDataBound della griglia. Quando crea la tua riga controlla l'ID nella tua griglia se è uguale all'ID della colonna che vuoi, quindi imposta la colonna uguale all'utente.

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

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

È possibile creare una classe wrapper per avvolgere altre classi disporre di dati deve essere vincolato alla rete. E quindi legare la griglia a questa classe wrapper.

La classe wrapper avrà entrambe le altre classi come membri figlio e esporrà i membri dati di entrambe le classi che è necessario associare alla griglia.

4

L'answar semplice sarà creare un nuovo datatable e assegnare tutti i valori in esso

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