通过从数据库加载数据来创建Gridview列标题 [英] Creating Gridview column Header by loading data from database

查看:42
本文介绍了通过从数据库加载数据来创建Gridview列标题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过从表中检索数据来绑定网格列标题名称.该表有两个字段,DomainID和DomainName,我想将DomainNames显示为Grid的Column标头.实际上,我正在创建员工网格视图.我希望将员工的所有域名显示为标题,并且必须在Checkbox中选中相应的域.

I want to bind my grid column header names by retrieving data from a table. This table has two fields, DomainID and DomainName, I want to display the DomainNames as Column header of the Grid. Actually I am creating employee grid view. I want all the domain names of employee to be displayed as a header and i have to check the corresponding domain in Checkbox.

请给我一些想法.

提前谢谢.

推荐答案

您可以将标头加载到 DataTable 中,然后使用自定义的 TemplateField 动态创建它们.

You could load the headers into a DataTable and then create them dynamically with a custom TemplateField.

这是aspx部分:

<asp:GridView ID="GridView1" AutoGenerateColumns="false" DataKeyNames="EmployeeID" runat="server" >
    <SelectedRowStyle BackColor="Aqua" />
    <Columns>
        <asp:TemplateField HeaderText="Employee" SortExpression="Employee">
           <ItemTemplate>
                <asp:HiddenField ID="HiddenEmpID" Value='<%# Bind("EmployeeID") %>' runat="server" />
                <asp:label runat="server" ID="LblEmployee" Text='<%# Bind("EmployeeName") %>'></asp:label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:Button ID="BtnSave" Text="Save" runat="server" onclick="BtnSave_Click" />

这是一个完整的示例:

public partial class GridTest : System.Web.UI.Page
{
    protected void Page_Init(object sender, EventArgs e)
    {
        CreateGridColumns();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) BindGrid();
    }

    private void CreateGridColumns()
    {
        var tblDomain = GetDomains();
        // Create dynamic TemplateFields
        foreach (DataRow row in tblDomain.Rows)
        {
            String domainName = row.Field<String>("DomainName");
            TemplateField field = new TemplateField();
            //Initalize the DataField value.
            field.ItemTemplate = new GridViewCheckBoxTemplate(ListItemType.Item, domaninName);
            field.HeaderText = domainName;
            //Add the newly created field to the GridView.
            GridView1.Columns.Add(field);
        }
    }

    private DataTable GetDomains()
    {
        var tblDomain = new DataTable();
        tblDomain.Columns.Add("DomainID", typeof(int));
        tblDomain.Columns.Add("DomainName");
        tblDomain.Rows.Add(1, "Google.com");
        tblDomain.Rows.Add(2, "Yahoo.com");
        tblDomain.Rows.Add(3, "Msn.com");
        tblDomain.Rows.Add(4, "Youtube.com");
        tblDomain.Rows.Add(5, "Myspace.com");
        tblDomain.Rows.Add(6, "Facebook.com");
        tblDomain.Rows.Add(7, "Wikipedia.org");
        return tblDomain;
    }

    private void BindGrid()
    {
        var tblDomain = GetDomains(); // load domains from database or wherever
        var tblData = new DataTable();// load sample data
        tblData.Columns.Add("EmployeeID", typeof(int));
        tblData.Columns.Add("EmployeeName");
        //add domains as DataTable-Columns 
        foreach (DataRow row in tblDomain.Rows)
        {
            String domaninName = row.Field<String>("DomainName");
            //Add column from domain-name
            tblData.Columns.Add(domaninName, typeof(bool)); //CheckBox-Checked is a boolean
        }

        //get some Employees and random checked state
        var rnd = new Random();
        var empRow = tblData.NewRow();
        empRow["EmployeeID"] = 1;
        empRow["EmployeeName"] = "Jon";
        foreach (DataRow dom in tblDomain.Rows)
        {
            empRow[dom.Field<String>("DomainName")] = rnd.Next(0, 2) == 0;
        }
        tblData.Rows.Add(empRow);
        empRow = tblData.NewRow();
        empRow["EmployeeID"] = 2;
        empRow["EmployeeName"] = "Eric";
        foreach (DataRow dom in tblDomain.Rows)
        {
            empRow[dom.Field<String>("DomainName")] = rnd.Next(0, 2) == 0;
        }
        tblData.Rows.Add(empRow);
        empRow = tblData.NewRow();
        empRow["EmployeeID"] = 3;
        empRow["EmployeeName"] = "Alain";
        foreach (DataRow dom in tblDomain.Rows)
        {
            empRow[dom.Field<String>("DomainName")] = rnd.Next(0, 2) == 0;
        }
        tblData.Rows.Add(empRow);

        GridView1.DataSource = tblData;
        GridView1.DataBind();
    }

    // show how to retrieve all checkbox values and the according EmployeeID
    protected void BtnSave_Click(object sender, EventArgs e)
    {
        if (GridView1.Rows.Count == 0) return;
        var checkBoxColumns = GridView1.Columns.Cast<DataControlField>()
            .Select((bf,index) => new{Field=bf, Index=index})
            .Where(f => f.Field.GetType() == typeof(TemplateField) && ((TemplateField)f.Field).ItemTemplate.GetType() == typeof(GridViewCheckBoxTemplate))
            .ToArray();

        foreach (GridViewRow row in GridView1.Rows)
        {
            int EmployeeID = int.Parse(((HiddenField)row.FindControl("HiddenEmpID")).Value);
            foreach (var f in checkBoxColumns)
            {
                String domain = f.Field.HeaderText;
                bool isChecked = row.Controls[f.Index].Controls.OfType<CheckBox>().First().Checked;
            }
        }
    }
}

这是自定义的 ITemplate :

public class GridViewCheckBoxTemplate : ITemplate
{
    ListItemType _templateType;
    string _columnName;

    public GridViewCheckBoxTemplate(ListItemType type, string colname)
    {
        _templateType = type;
        _columnName = colname;
    }

    void ITemplate.InstantiateIn(System.Web.UI.Control container)
    {
        switch (_templateType)
        {
            case ListItemType.Header:
               break;
            case ListItemType.Item:
                var chb1 = new CheckBox();
                chb1.DataBinding += new EventHandler(CB_DataBinding);
                container.Controls.Add(chb1);
                break;
            case ListItemType.EditItem:
                //As, I am not using any EditItem, I didnot added any code here.
                break;
            case ListItemType.Footer:
                break;
        }
    }

    void CB_DataBinding(object sender, EventArgs e)
    {
        CheckBox chb = (CheckBox)sender;
        GridViewRow container = (GridViewRow)chb.NamingContainer;
        object dataValue = ((DataRowView)container.DataItem)[_columnName];
        chb.Checked = dataValue != DBNull.Value && (bool)dataValue;
    }
}

这篇关于通过从数据库加载数据来创建Gridview列标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆