2012-04-12 5 views
4

Ich möchte meine Grid-Spaltenheadernamen durch Abrufen von Daten aus einer Tabelle binden. Diese Tabelle hat zwei Felder, DomainID und DomainName, ich möchte die DomainNames als Column Header des Grid anzeigen. Eigentlich erstelle ich Mitarbeiter Rasteransicht. Ich möchte, dass alle Domain-Namen des Mitarbeiters als Header angezeigt werden, und ich muss die entsprechende Domain in Checkbox überprüfen.Erstellen der Gridview-Spalte Header durch Laden von Daten aus der Datenbank

Bitte geben Sie mir einige Ideen.

Vielen Dank im Voraus.

+1

Es ist nicht klar, was Sie im Grid zeigen wollen . Wo werden der Mitarbeitername und die CheckBoxen angezeigt? –

+1

Bitte löschen Sie was Sie wollen? –

+0

Mitarbeiter Name und ID Felder kommen zuerst, dann die dynamischen Überschriften müssen am Ende kommen Edit und Delete., Checkboxen werden in Zeilen kommen, wird es für die entsprechenden Domänen überprüft werden. – Lakshmitha

Antwort

1

Von dem, was ich verstanden ....

  1. eine Ansicht Gitter Make
  2. zwei Spalten erstellen: ein. TextBoxColumn b. CheckBoxColumn
  3. Legen Sie Ihre Spaltenkopf mit .HeaderText Eigenschaft
  4. die Spalten hinzufügen, um Ihre Daten Kurzansicht
  5. Abfrage der Datenbank und erhalten die data_table von ihm
  6. mit dgv.DataSource = data_table Ihre Daten an das binden Tabelle OR ein for-Schleife für alle Zeilen in den data_table Stellen und jede Zeile explizit

  7. für Ihre Kontrollkästchen immer arbeiten, übernimmt das cellContentClick Ereignis des Datenrasteransicht und führen Sie das notwendige Updates in Ihrem da hinzufügen TAbase .....

Hoffe, es hilft ....

1

Sie könnten die Header in eine DataTable laden und dann schaffen sie dynamisch mit einem benutzerdefinierten TemplateField. Teil

Hier ist der 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" /> 

ist die komplette Beispiel:

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

Hier ist der Brauch 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; 
    } 
} 
Verwandte Themen