我正在尝试动态创建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;
它没有找到信息。是否可以将用户列设置为其他DataSource?
答案 0 :(得分: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();
答案 1 :(得分:0)
如果您有列表(可枚举),则可以使用基于join的方案。如果一对一,则加入或者加入groupjoin。
这将生成单个数据源列表,并且易于绑定或从数据库服务器检索数据,然后也可以使用数据库服务器上的连接。
从技术上讲,我不认为我们可以将多个数据源绑定到简单网格(树视图和父子视图除外)。网格以行格式显示数据,因此要在集合中生成单行所需的单个对象或实体。如果提供两个数据源,则两者之间必须存在关联。对于Ex: - 首先有10行,第二行有20,那么行网格应该如何显示?因此,对于所有这些需要使用关系并创建单个视图。可以在网格中显示。
答案 2 :(得分:0)
我认为你最好的方法是使用Linq。通过公共字段(如ID字段)将对象绑定在一起。现在数据已链接在一起,您可以显示它现在位于对象中的用户列。
创建网格。
<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
};
答案 3 :(得分:0)
您可以创建一个包装类来包装其他具有数据需要绑定到网格的类。然后将网格绑定到此包装类。
包装器类将两个其他类作为子成员,并将从需要绑定到网格的两个类中公开数据成员。