2013-12-19 24 views
6

私は、テーブルのリストを持つドロップダウンリストボックスを持っています。その下にはGridViewがあります。ドロップダウンリストボックスから選択されたテーブルに基づいて、GridViewを動的に読み込みます。テーブルは異なるカラム名を持つ可能性があるため、GridViewのテンプレートフィールドを動的に作成する必要があります。以下は私のバインド機能です。私は2つの問題があります (1)ドロップダウンリストの選択に基づいてGridViewが設定されているので、If(!IsPostBack)のバインディング部分を折り返すことができませんでしたので、選択を変更するたびに列が複製されます (2)そして、私はデータを持っていない、私はtField(TemplateField)のItemTemplateを設定する必要があると思うが、どうやってそれを行うのですか?TemplateFieldをコード内のgridviewに追加するにはどうすればいいですか?

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) 
{ 
… 

} 
} 

答えて

14

の世話をしなければならない様々なステップがあります:私は がITemplateインタフェースを継承するクラスを作成します::

STEPは。 ITemplateインターフェイスの関数InstantiateIn()を上書きします。

STEP II:

そのパラメータとしてListItemTypeオブジェクトを取り、あなたのクラスのコンストラクタを定義します。その後、

STEP III ::

コンテナのControlsコレクションに追加されたコントロールは、いくつかのデータソースの列にバインドする を持っている場合は、OnDataBindingイベントに ハンドラを登録します。イベントが発生したら、データソースからテキスト を取得し、コントロールに割り当てます。例えば、hyprLnk_DataBindingイベントは、ItemTemplateの内部に作成されたコントロールへのデータのバインド用に定義されています。

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

それだけです。上記は、GridViewに対して動的にItemTemplateを作成し、コントロールをアイテムテンプレートに追加するサンプルに過ぎませんでした。

以下は、実際にテンプレート列を動的に作成するための呼び出しを実行する関数です。この関数は、たとえば次のような場合に呼び出すことができます。 DropDownlistイベントハンドラから取得します。

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

NOTE ::、姓と名が名前のカスタムクラスのコンストラクタに渡された列です:私は(にStoredProcを使用して)カスタムのページングと以下のように同じ機能を行っているTemplateGenerator

0

多くのテーブルで100の+万レコードのために、更新、削除、また挿入します

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?');"; 
      } 
     } 

はそれが役に立てば幸い:

関連する問題