将DataTable绑定到GridView的模板字段

时间:2014-06-27 16:47:01

标签: c# asp.net gridview datatable

我可以通过自动生成列将DataTable成功绑定到GridView,但我需要为其中一列显示多行单元格。为此,我想使用TextBox对象将模板字段与项目模板一起使用。我通过添加列然后添加行来填充DataTable。我知道我的数据表设置正确,因为它显示了我想要的所有数据(多线单元格除外)。我的问题是让gridview根据列名提取我的数据并填写我设置的模板字段。如果我关闭AutoGenerateColumns,那么仍然会出现4个模板字段列(根据数据表也是正确的数量),只是空白,如果我将其设置为true,则会显示4个空白列以及4个附加列包含我的数据的相同标头,使用单元格包含的默认值来显示信息。

    <asp:GridView ID="DataGrid1" runat="server" AutoGenerateColumns="False"     HeaderStyle-BorderStyle="None" CellPadding="3" ItemStyle-Wrap="true" >
    <Columns>
        <asp:TemplateField HeaderText="Code">
            <asp:ItemTemplate>
                <asp:Label ID="txtCode" runat="server" Text='<%# Eval("Code") %>'>

                </asp:Label>
            </asp:ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Title">
            <asp:ItemTemplate>
                <asp:Label ID="txtTitle" runat="server" Text='<%# Eval("Title") %>'>

                </asp:Label>
            </asp:ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Class">
            <asp:ItemTemplate>
                <asp:Label ID="txtClass" runat="server" Text='<%# Eval("Class") %>'>

                </asp:Label>
            </asp:ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="History">
            <asp:ItemTemplate>
                <asp:TextBox ID="txtHistory" runat="server" IsReadOnly="true" Text='<%# Eval("History")%>'>
                </asp:TextBox>
            </asp:ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

以上是我的asp.net代码中与GridView相关的部分。以下是我如何设置我的DataTable并将其绑定。

DataTable table = new DataTable();
table.Columns.Add("Code", typeof(string));
table.Columns.Add("Title", typeof(string));
table.Columns.Add("Class", typeof(string));
table.Columns.Add("History", typeof(string));
for (int i = 0; i < index; i++)
{
    table.Rows.Add(docs[i].Code, docs[i].Name, docs[i].Class.Name, history[i]);
}
DataGrid1.DataSource = table;
DataGrid1.DataBind();

2 个答案:

答案 0 :(得分:3)

更改.aspx代码,如下所示

  <Columns>
        <asp:TemplateField HeaderText="Code">
            <ItemTemplate>
                <asp:Label ID="txtCode" runat="server" Text='<%# Eval("Code") %>'>

                </asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Title">
            <ItemTemplate>
                <asp:Label ID="txtTitle" runat="server" Text='<%# Eval("Title") %>'>

                </asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Class">
            <ItemTemplate>
                <asp:Label ID="txtClass" runat="server" Text='<%# Eval("Class") %>'>

                </asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="History">
            <ItemTemplate>
                <asp:TextBox ID="txtHistory" runat="server" IsReadOnly="true" 
                        Text='<%# Eval("History")%>'>
                </asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>

答案 1 :(得分:-1)

     foreach (GridViewRow grdRow in grdMenuPermitted.Rows)
        {
            DataRow drow = dt.NewRow();

            Label lblMenuName = (Label)grdRow.FindControl("lblMenuName");

            HiddenField hdnID = (HiddenField)grdRow.FindControl("hdnID");

            drow["MenuName"] = lblMenuName.Text;//grdRow.Cells[0].Text;                
            drow["MenuID"] = hdnID.Value;
            //drow["lname"] = grdRow.Cells[3].Text;
            dt.Rows.Add(drow);
        }