2013-12-19 6 views
6

Ich habe eine Dropdown-Liste mit einer Liste von Tabellen. Darunter befindet sich GridView. Basierend auf der Tabelle, die aus dem Dropdown-Listenfeld ausgewählt wurde, befülle ich die GridView dynamisch. Da die Tabellen unterschiedliche Spaltennamen haben können, muss ich das Vorlagenfeld für die GridView dynamisch erstellen. Folgendes ist meine Bindefunktion. Ich habe zwei Probleme (1) Ich konnte den Bindungsteil in If (! IsPostBack) nicht umbrechen, da das GridView basierend auf der Auswahl der Dropdown-Liste aufgefüllt wird, so dass jedes Mal, wenn ich die Auswahl ändere, die Spalten dupliziert werden (2) Und ich habe keine Daten, ich denke ich muss ItemTemplate des tField (TemplateField) setzen, aber wie mache ich das?Wie fügt man TemplateField zu einer Gridview im Code dahinter hinzu?

private void BindGridView() 
{ 
DataSet ds = new DataSet(); 

try 
{ 
ds = … 
if (ds.Tables.Count > 0) 
{ 

foreach (DataColumn dc in ds.Tables[0].Columns) 
{ 
TemplateField tField = new TemplateField(); 
tField.HeaderText = dc.ColumnName; 
GridView2.Columns.Add(tField); 
} 


GridView2.DataSource = ds.Tables[0]; 
GridView2.DataBind(); 
} 
else 
{ 
… 
} 
} 
catch (Exception ex) 
{ 
… 

} 
} 

Antwort

14

Es gibt verschiedene Schritte, die gesorgt werden soll:

STEP :: I Erstellen Sie eine Klasse erbt die ITemplate Schnittstelle. Überschreiben Sie die Funktion InstantiateIn() der ITemplate Schnittstelle.

STEP II:

einen Konstruktor für Ihre Klasse definieren, die ein ListItemType-Objekt als Parameter übernimmt.

STEP III ::

Wenn die Steuerung auf den Controls-Auflistung des Containers hinzugefügt werden muss bis zu einem gewissen Datenquelle Säule gebunden zu sein, registrieren Sie dann die Handler für das OnDataBinding Ereignis. Wenn das Ereignis eintritt, rufen Sie den Text aus der Datenquelle ab und weisen Sie ihn Ihrem Steuerelement zu. Beispiel: hyprLnk_DataBinding Ereignis ist für das Binden von Daten an Ihre Steuerelemente definiert, die in ItemTemplate erstellt werden.

public class TemplateGenerator : ITemplate // Class inheriting ITemplate 
    { 
     ListItemType type; 
     string columnName;  
     public TemplateGenerator(ListItemType t, string cN) 
     {   
      type = t;  
      columnName= cN;  
     } 
     // Override InstantiateIn() method 
     void ITemplate.InstantiateIn(System.Web.UI.Control container) 
     {  
      switch (type) 
      { 
       case ListItemType.Item:  
        HyperLink hyprLnk = new HyperLink(); 
        hyprLnk.Target = "_blank"; //Optional. 
        hyprLnk.DataBinding+=new EventHandler(hyprLnk_DataBinding); 
        container.Controls.Add(hyprLnk); 
       break;  
      } 
     }  
// The DataBinding event of your controls 
void hyprLnk_DataBinding(object sender, EventArgs e) 
     {  
     HyperLink hyprlnk = (HyperLink)sender; 
     GridViewRow container = (GridViewRow)hyprlnk.NamingContainer; 
     object bindValue = DataBinder.Eval(container.DataItem,columnName); 
     // Adding check in case Column allows null values 
     if (bindValue != DBNull.Value) 
     { 
      hyprlnk.Text = bindValue.ToString(); 
      hyprlnk.NavigateUrl = "http://www.google.com"; 
     } 
    } 

Das ist alles. Oben war nur ein Beispiel, um ItemTemplate dynamisch für GridView zu erstellen und der Artikelvorlage Steuerelemente hinzuzufügen.

Jetzt, Unten ist die Funktion, die tatsächlich die Aufrufe zum dynamischen Erstellen von Vorlagen Spalten ausführen wird. Sie können diese Funktion aufrufen, wenn dies z.B. von Ihrem DropDownlist Event Handler.

protected void GenerateGridViewColumnsDynamically() 
     { 
      // Create the TemplateField 
      TemplateField firstName = new TemplateField(); 
      firstName.HeaderText = "First_Name"; 
      firstName.ItemTemplate = new TemplateGenerator(ListItemType.Item, 
                  "FirstName"); 
      // Showing boundField example just for more context 
      BoundField lastName = new BoundField(); 
      lastName.DataField = "LastName"; 
      lastName.HeaderText = "Last_Name"; 
      // Add the Columns now 
      MyGridView.Columns.Add(firstName); 
      MyGridView.Columns.Add(lastName); 
     } 

HINWEIS :: Vorname und Nachname sind die Spalten, deren Namen an den Konstruktor der benutzerdefinierten Klasse übergeben werden: Templategenerator

0

Ich habe die gleiche Funktionalität wie unten mit benutzerdefinierten Paging getan (mit StoredProc) für mehr als 100 Millionen Datensätze in vielen Tabellen, zu aktualisieren, löschen und auch einfügen:

CREATE PROCEDURE [dbo].[sp_Mk] 
    @PageIndex INT, 
    @PageSize INT, 
    @tableName nvarchar(255), 
    @totalRow INT Output 
AS 
BEGIN 
DECLARE @sql NVARCHAR(MAX) 
Declare @anotherSql NVARCHAR(1000) 
DECLARE @ParamDefinition NVARCHAR(500) 

--DECLARE @totalRow INT 
Set @sql = 'WITH TempResult AS(SELECT * FROM '[email protected]+'), TempCount AS (SELECT COUNT(*) AS MaxRows FROM TempResult) 
SELECT * FROM TempResult, TempCount ORDER BY (Select Null) 
    OFFSET '+CONVERT(VARCHAR(20),(@PageIndex-1)*@PageSize) +' ROWS FETCH NEXT '+CONVERT(VARCHAR(20),@PageSize)+' ROWS ONLY' 

PRINT @SQL 
EXECUTE sp_executesql @SQL 
Set @anotherSql=N'SELECT COUNT(*) as totalRow FROM '[email protected] 
SET @ParamDefinition = N'@totalRowOutPut INT OUTPUT' 
--PRINT @anotherSql 
Execute sp_executesql @anotherSql, 
@ParamDefinition, 
[email protected][email protected], 
@[email protected] OUTPUT 
End 




<asp:GridView CssClass="table-striped header-fixed" ID="grdDynamic" runat="server" AutoGenerateColumns="True" ShowHeaderWhenEmpty="true" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" 
      OnRowEditing="OnRowEditing_grdDynamic" OnRowUpdating="OnRowUpdating_grdDynamic" OnRowCancelingEdit="OnRowCancelingEdit_grdDynamic" OnRowDeleting="OnRowDeleting_grdDynamic" OnRowDataBound="OnRowDataBound_grdDynamic"> 
      </asp:GridView><br/> 
      <asp:linkbutton id="AddButton" runat="server" commandname="Add" text="Insert: " OnClick="AddNewButton_Click" /><br/> 
      <asp:Repeater ID="rptPager" runat="server"> 
       <ItemTemplate> 
        <asp:LinkButton ID="lnkPage" CssClass="pagination-ys" runat="server" Text = '<%#Eval("Text") %>' CommandArgument = '<%# Eval("Value") %>' Enabled = '<%# Eval("Enabled") %>' OnClick = "Page_Changed"></asp:LinkButton> 
       </ItemTemplate> 
      </asp:Repeater><asp:HiddenField runat="server" id="hdnPageIndex" Value="1"></asp:HiddenField> 





SqlConnectionStringBuilder builder; 
     int pageSize = 100; 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      builder = new SqlConnectionStringBuilder(connectionString); 
      if (!IsPostBack) 
      { 
       using (SqlConnection connObj = new SqlConnection(connectionString)) 
       { 
        connObj.Open(); 

        using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='" + builder.InitialCatalog + "' AND TABLE_NAME Not In('AspNetUsers') Order By TABLE_NAME", connObj)) 
        { 
         DataSet ds = new DataSet(); 
         adapter.Fill(ds); 
         ddlTableNames.DataSource = ds; 
         ddlTableNames.DataBind(); 
         ddlTableNames.Items.Insert(0, new ListItem("Select Table", String.Empty)); 
        } 
       } 
      } 
      //} 
      //else if(ddlTableNames.Visible) ddlTableNames.Visible = false; 
     } 

     protected void ddlTableNames_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (ddlTableNames.SelectedValue != "") 
      { 
       grdDynamic.Visible = true; 
       this.BindGrid(ddlTableNames.SelectedValue, Convert.ToInt32(hdnPageIndex.Value)); 
      } 
      else if (grdDynamic.Visible == true) grdDynamic.Visible = false; 
     } 

     private void BindGrid(string selectedTable, int pageIndex, bool addNewRow=false) 
     { 
      using (SqlConnection connObj = new SqlConnection(connectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand("sp_Mk", connObj)) 
       { 
        int recordCount=0; 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.AddWithValue("@PageIndex", pageIndex); 
        cmd.Parameters.AddWithValue("@PageSize", pageSize); 
        cmd.Parameters.AddWithValue("@tableName", ddlTableNames.SelectedValue); 
        SqlParameter totalRow = new SqlParameter("@totalRow", SqlDbType.Int, 4); 
        totalRow.Direction = ParameterDirection.Output; 
        cmd.Parameters.Add(totalRow); 
        connObj.Open(); 
        SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
        DataSet ds = new DataSet(); 
        adapter.Fill(ds); 
        grdDynamic.DataSource = ds.Tables[0]; 
        if (addNewRow) ds.Tables[0].Rows.Add(); 
        recordCount = Convert.ToInt32(ds.Tables[1].Rows[0].ItemArray[0]); 
        grdDynamic.DataBind(); 

        connObj.Close(); 
        if (totalRow.Value != DBNull.Value) 
        { 

        } 
        this.PopulatePager(recordCount, pageIndex); 
       } 
      } 
     } 

     private void PopulatePager(int recordCount, int currentPage) 
     { 
      double dblPageCount = (double)((decimal)recordCount/pageSize); 
      int pageCount = (int)Math.Ceiling(dblPageCount); 
      List<ListItem> pages = new List<ListItem>(); 
      if (pageCount > 0) 
      { 
       pages.Add(new ListItem("First", "1", currentPage > 1)); 
       for (int i = 1; i <= pageCount; i++) 
       { 
        ListItem item=new ListItem(i.ToString(), i.ToString(), i != currentPage); 
        if (i == currentPage) item.Attributes.Add("style", "color:red;"); 
        pages.Add(item); 
       } 
       pages.Add(new ListItem("Last", pageCount.ToString(), currentPage < pageCount)); 
      } 
      rptPager.DataSource = pages; 
      rptPager.DataBind(); 
     } 

     protected void Page_Changed(object sender, EventArgs e) 
     { 
      int pageIndex = int.Parse((sender as LinkButton).CommandArgument); 
      hdnPageIndex.Value = pageIndex.ToString(); 
      this.BindGrid(ddlTableNames.SelectedValue, pageIndex); 
     } 

     protected void OnRowEditing_grdDynamic(object sender, GridViewEditEventArgs e) 
     { 
      grdDynamic.EditIndex = e.NewEditIndex; 
      this.BindGrid(ddlTableNames.SelectedValue, Convert.ToInt32(hdnPageIndex.Value)); 
     } 

     protected void OnRowUpdating_grdDynamic(object sender, GridViewUpdateEventArgs e) 
     { 
      GridViewRow row = grdDynamic.Rows[e.RowIndex]; 
      string updateStatement = string.Empty; 
      for (int x = 0; x < row.Cells.Count; x++) updateStatement = updateStatement + grdDynamic.DataKeys[e.RowIndex].Values[x] + " = " + grdDynamic.DataKeys[e.RowIndex].Values[x] + ", "; 
      //int recordId = Convert.ToInt32(grdDynamic.DataKeys[e.RowIndex].Values[0]); 
      using (SqlConnection con = new SqlConnection(connectionString)) 
      { 
       //using (SqlCommand cmd = new SqlCommand("UPDATE "+selectedTable"+ SET Name = @Name, Country = @Country WHERE CustomerId = @CustomerId")) 
       { 
        cmd.Connection = con; 
        con.Open(); 
        cmd.ExecuteNonQuery(); 
        con.Close(); 
       } 
      } 
      grdDynamic.EditIndex = -1; 
      this.BindGrid(ddlTableNames.SelectedValue, Convert.ToInt32(hdnPageIndex.Value)); 
     } 

     protected void OnRowCancelingEdit_grdDynamic(object sender, EventArgs e) 
     { 
      grdDynamic.EditIndex = -1; 
      this.BindGrid(ddlTableNames.SelectedValue, Convert.ToInt32(hdnPageIndex.Value)); 
     } 

     protected void OnRowDeleting_grdDynamic(object sender, GridViewDeleteEventArgs e) 
     { 
      int recordId = Convert.ToInt32(grdDynamic.DataKeys[e.RowIndex].Values[0]); 
      using (SqlConnection con = new SqlConnection(connectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand("DELETE FROM " + ddlTableNames.SelectedValue + " WHERE RecordId = @recordId")) 
       { 
        cmd.Connection = con; 
        con.Open(); 
        cmd.ExecuteNonQuery(); 
        con.Close(); 
       } 
      } 
      this.BindGrid(ddlTableNames.SelectedValue, Convert.ToInt32(hdnPageIndex.Value)); 
     } 

     protected void btnGo_Click(object sender, EventArgs e) 
     { int myInt; 
      if(txtPageSize.Text!=null && txtPageSize.Text !=string.Empty) 
       if(int.TryParse(txtPageSize.Text, out myInt)) pageSize = myInt; 
      hdnPageIndex.Value = "1"; 
      this.BindGrid(ddlTableNames.SelectedValue, 1); 
     } 

     protected void AddNewButton_Click(object sender, EventArgs e) 
     { 
      hdnPageIndex.Value="1"; 
      this.BindGrid(ddlTableNames.SelectedValue, Convert.ToInt32(hdnPageIndex.Value), true); 
     } 

     protected void OnRowDataBound_grdDynamic(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowIndex != grdDynamic.EditIndex) 
      { 
       (e.Row.Cells[0].Controls[2] as LinkButton).Attributes["onclick"] = "return confirm('Do you want to delete this row?');"; 
      } 
     } 

Hoffe, es hilft:

Verwandte Themen