4

テーブルからデータを取得して、グリッドの列ヘッダー名をバインドしたいと考えています。このテーブルには、DomainID と DomainName の 2 つのフィールドがあり、DomainNames をグリッドの列ヘッダーとして表示したいと考えています。実際に従業員グリッド ビューを作成しています。従業員のすべてのドメイン名をヘッダーとして表示したいので、チェックボックスで対応するドメインをチェックする必要があります。

アイデアをください。

前もって感謝します。

4

2 に答える 2

1

私が理解したことから....

  1. グリッドビューを作成する
  2. 2つの列を作成します。TextBoxColumnb。CheckBoxColumn
  3. .HeaderTextプロパティを使用して列ヘッダーを設定します
  4. データグリッドビューに列を追加します
  5. データベースをクエリし、そこからdata_tableを取得します
  6. dgv.DataSource = data_tableを使用して、データをテーブルにバインドするか、data_tableのすべての行に対してforループを作成し、各行を明示的に追加します

  7. チェックボックスを機能させるには、データグリッドビューのcellContentClickイベントを処理し、データベースで必要な更新を実行します。

それが役に立てば幸い....

于 2012-04-12T08:48:47.227 に答える
1

ヘッダーを にロードしてDataTableから、カスタム で動的に作成できます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;
    }
}
于 2012-04-12T10:37:00.497 に答える