2016-12-14 20 views
0

codebehindからgridviewに列を追加しています。 バインドフィールドの場合、行を更新するときにコントロールとテキストボックスの値を見つけることができます。 しかし、テンプレートフィールドでは、コードの背後にコントロールを取得できないため、テキストボックスの値を取得できません。 は、テンプレートのフィールドに分離コードでテキストボックスの値を取得する方法を提案してくださいすることができGridViewでTemplateFieldsのRowEditingイベントでコントロールを検索できません

私は行を更新しながら、テンプレートフィールドのテキストボックスの値を読み取るための次のコードを使用していますが、コントロールは0です

protected void gvbind() 
{ 
    conn.Open(); 
    string Query = "SELECT * FROM testactiondatabase_db.actions"; 
    MySqlCommand MyCommand2 = new MySqlCommand(Query, conn); 

    MySqlDataAdapter MyAdapter = new MySqlDataAdapter(); 
    MyAdapter.SelectCommand = MyCommand2; 
    DataTable dt = new DataTable(); 
    MyAdapter.Fill(dt); 

    TaskGridView.Columns.Clear(); 
    for (int i = 0; i < dt.Columns.Count; i++) 
    { 
     if (dt.Columns[i].ColumnName.ToString().ToUpper().Contains("DATE")) 
     { 
      TemplateField bfield = new TemplateField(); 
      bfield.HeaderTemplate = new GridViewTemplate(ListItemType.Header, dt.Columns[i].ColumnName.ToString()); 
      bfield.ItemTemplate = new GridViewTemplate(ListItemType.Item, dt.Columns[i].ColumnName.ToString()); 
      bfield.EditItemTemplate = new GridViewTemplate(ListItemType.EditItem, dt.Columns[i].ColumnName.ToString()); 
      TaskGridView.Columns.Add(bfield); 
     } 
     else 
     { 
      BoundField boundfield = new BoundField(); 
      boundfield.DataField = dt.Columns[i].ColumnName.ToString(); 
      boundfield.HeaderText = dt.Columns[i].ColumnName.ToString(); 
      TaskGridView.Columns.Add(boundfield); 
     } 
    } 

    TaskGridView.DataSource = dt; 
    TaskGridView.DataBind(); 
    TaskGridView.Width = 600; 
    TaskGridView.HeaderStyle.CssClass = "header"; 
    TaskGridView.RowStyle.CssClass = "rowstyle"; 

    conn.Close(); 
} 

public class GridViewTemplate : ITemplate 
{ 
    ListItemType _templateType; 

    string _columnName; 

    public GridViewTemplate(ListItemType type, string colname) 
    { 

     _templateType = type; 

     _columnName = colname; 
    } 

    void ITemplate.InstantiateIn(System.Web.UI.Control container) 
    { 
     switch (_templateType) 
     { 
      case ListItemType.Header: 
       Label lbl = new Label(); 
       lbl.Text = _columnName; 
       container.Controls.Add(lbl); 
       break; 

      case ListItemType.Item: 
       Label lb1 = new Label(); 
       lb1.DataBinding += new EventHandler(lb1_DataBinding); 
       container.Controls.Add(lb1); 
       break; 

      case ListItemType.EditItem: 
       TextBox tb1 = new TextBox(); 
       tb1.ID = _columnName; 
       tb1.DataBinding += new EventHandler(tb1_DataBinding); 
       tb1.Attributes.Add("class", "myDatePickerClass"); 
       container.Controls.Add(tb1); 
       break; 

      case ListItemType.Footer: 
       CheckBox chkColumn = new CheckBox(); 
       chkColumn.ID = "Chk" + _columnName; 
       container.Controls.Add(chkColumn); 
       break; 
     } 
    } 

    void tb1_DataBinding(object sender, EventArgs e) 
    { 
     TextBox txtdata = (TextBox)sender; 
     GridViewRow container = (GridViewRow)txtdata.NamingContainer; 
     object dataValue = DataBinder.Eval(container.DataItem, _columnName); 
     if (dataValue != DBNull.Value) 
     { 
      txtdata.Text = Convert.ToDateTime(dataValue.ToString()).ToString("dd/MM/yyyy"); 
     } 
    } 

    void lb1_DataBinding(object sender, EventArgs e) 
    { 
     Label txtdata = (Label)sender; 
     GridViewRow container = (GridViewRow)txtdata.NamingContainer; 
     object dataValue = DataBinder.Eval(container.DataItem, _columnName); 
     if (dataValue != DBNull.Value) 
     { 
      txtdata.Text = Convert.ToDateTime(dataValue.ToString()).ToString("dd/MM/yyyy"); 
     } 
    } 
} 

マイコード細胞。

答えて

0

FindControlを使用してください。

TextBox textnew = TaskGridView.Rows[e.RowIndex].FindControl(_columnName) as TextBox; 

しかし、私はこのようなあなたのスニペットを使用する場合は、手動でEditIndexを設定すると、それも動作します... TEのTextBoxの値は、セル1が変更されています。

TaskGridView.EditIndex = 1; 
TaskGridView.DataSource = dt; 
TaskGridView.DataBind(); 
TaskGridView.Width = 600; 
TaskGridView.HeaderStyle.CssClass = "header"; 
TaskGridView.RowStyle.CssClass = "rowstyle"; 

GridViewRow row = (GridViewRow)TaskGridView.Rows[TaskGridView.EditIndex]; 
TextBox textnew = (TextBox)row.Cells[1].Controls[0]; 
textnew.Text = "test"; 
+0

問題は(TextBox)row.Cells [j]にコントロールがないことです。テンプレートのテキストボックスコントロールが失われているかのようです。誰がなぜこれが起こるのか知っていますか? – siva

関連する問題