2017-08-08 57 views
0

我需要生成包含基於存儲在數據庫中的數據複選框列(該網格可以有不同數量的每月列)如何讀取自定義模板控件的代碼後面加

我有了這個代碼與我的網格控件的自定義模板:

ASPX部分:

 <asp:Button runat="server" ID="bt_save_top" OnClick="bt_save_Click" Text="Save" /> 
     <asp:GridView runat="server" ID="gv_result" AutoGenerateColumns="false" BorderStyle="Solid" BorderWidth="1" RowStyle-BorderWidth="1" RowStyle-BorderStyle="Solid"> 
     </asp:GridView> 

* CS:

protected void Page_Load(object sender, EventArgs e) 
    { 

     var ds = new DataSet();//getting data from database 
     var weekDayColumns = GenerateColumns(ds); 
     foreach (DataControlField dataControlField in weekDayColumns) 
     { 
      gv_result_tw.Columns.Add(dataControlField); 
     } 
     gv_result_tw.DataSource = ds.Tables[0]; 
     gv_result_tw.DataBind(); 
    } 
    private DataControlFieldCollection GenerateColumns(DataSet dsTable) 
    { 
     var columns = new DataControlFieldCollection(); 
     foreach (DataColumn column in dsTable.Tables[0].Columns) 
     { 
      var itemTemplate = new TemplateField 
      { 
       HeaderText = column.Caption, 
       ControlStyle = 
       { 
        CssClass = "gv_row" 
       }, 
       HeaderStyle = 
       { 
        CssClass = "gv_row" 
       }, 
       ItemTemplate = new CustomItemTemplate(ListItemType.Item, column.ColumnName) 
      }; 
      columns.Add(itemTemplate); 
     } 

     return columns; 
    } 

    protected void bt_save_Click(object sender, EventArgs e) 
    { 
     foreach(var row in gv_result_tw.Rows) 
     { 
       var columnNameField = gvr.FindControl("hidden_time") as HiddenField; 
      // Here i'm getting always null 
     } 
    } 

CustomItemTemplate.cs

public class CustomItemTemplate : ITemplate 
    { 
     private readonly ListItemType _type; 
     private readonly string _columnName; 
     public ItemTemplateGenerator(ListItemType t, string columnName) 
     { 
      _type = t; 
      _columnName = columnName; 
     } 

     // Override InstantiateIn() method 
     void ITemplate.InstantiateIn(Control container) 
     { 
      switch (_type) 
      { 
       case ListItemType.Item: 
        var visibleCheckbox = new CheckBox 
        { 
         ID = $"chb_{_columnName.Replace(":", "_")}_visible" 
        }; 
        visibleCheckbox.DataBinding += VisibleCheckbox_DataBinding; 

        var invisibleField = new HiddenField 
        { 
         ID = $"chb_{_columnName.Replace(":", "_")}_invisible" 
        }; 
        var hiddenInput = new HiddenField 
        { 
         ID = $"hidden_time", 
         Value = _columnName 
        }; 
        container.Controls.Clear(); 
        container.Controls.Add(hiddenInput); 
        container.Controls.Add(visibleCheckbox); 
        container.Controls.Add(invisibleField); 
        break; 
      } 
     } 
     // The DataBinding event of your controls 
     private void VisibleCheckbox_DataBinding(object sender, EventArgs e) 
     { 
      var checkBox = (CheckBox)sender; 
      var container = (GridViewRow)checkBox.NamingContainer; 
      var hiddenField = (HiddenField)checkBox.NamingContainer.FindControl($"chb_{_columnName.Replace(":","_")}_invisible"); 
      var bindValue = DataBinder.Eval(container.DataItem, _columnName); 
      // Adding check in case Column allows null values 
      if (bindValue != DBNull.Value) 
      { 
       hiddenField.Value = bindValue.ToString(); 
       checkBox.Checked = bindValue.ToString() == "1"; 
      } 
     } 
    } 

所以,問題是我應該怎麼做這個 「的FindControl」,以獲得適當的領域,而不是空?

如果您需要更多詳細信息,請直接詢問。

回答

0

您必須進行兩項更改,一項是您的CustomItemTemplate實現的InstantiateIn,以便容器也獲得一個ID。在這種情況下,我挑選的_columnName值:

public class CustomItemTemplate : ITemplate 
{ 
    // stuff omitted for brevity  

    // Override InstantiateIn() method 
    void ITemplate.InstantiateIn(Control container) 
    { 
     // set the ID of the container these fields are in! 
     container.ID = _columnName; 
     // rest of your code 
     // make sure hidden_time is still unique! 
     var hiddenInput = new HiddenField 
      { 
       ID = $"{_columnName.Replace(":", "_")}_hidden_time", 
       Value = _columnName 
      }; 
    } 
} 

然後你按一下按鈕實現可以利用該ID,當它襯托找到控制:

protected void bt_save_Click(object sender, EventArgs e) 
{ 
    // a GridViewRow has cells ... 
    foreach (GridViewRow row in gv_result_tw.Rows) 
    { 
     // ... the cells are of type DataControlFieldCell 
     foreach (DataControlFieldCell col in row.Cells) 
     { 
      // ... but we get some bonus fields as well 
      if (col.Controls.Count > 0) 
      { 
       // .. if we skip those 
       // ... we get a cell that has its ID set to the value 
       // that was used to generate the ID of the hiddenfield 
       var columnNameField = row.FindControl(col.ID + "_hidden_time") as HiddenField; 
       // columnNameField will not be null now ... 
      } 
     } 
    } 
} 
相關問題