2012-04-09 2 views
1

Привет, я добавил динамическое поле шаблона в gridview, реализовав интерфейс ITemplate. Поле шаблона содержит некоторые элементы управления, такие как ярлыки и текстовые поля. как я могу получить эти элементы управления в событии row databound.найти элемент управления с помощью идентификатора из динамически добавленного поля шаблона в GridView

Я не могу получить, когда я делаю gridviewrow.findcontrol («id»), как обычно, когда мы добавляем шаблон с страницы aspx.

Путь я добавил поле шаблона, как это

public class CustomGridViewColumn : ITemplate { ListItemType _liType; string _columnName;

 public CustomGridViewColumn(ListItemType type, string column) 
     { 
      _liType = type; 
      _columnName = column; 

     } 
     void ITemplate.InstantiateIn(System.Web.UI.Control container) 
     { 
      switch (_liType) 
      { 
       case ListItemType.Header: 
        Label lblHeader = new Label(); 
        lblHeader.Text = _columnName; 
        container.Controls.Add(lblHeader); 
        break; 
       case ListItemType.Item: 
        Label lblItem = new Label(); 
        lblItem.DataBinding += new EventHandler(lbl_DataBinding); 
        lblItem.ID = "lbl" + _columnName; 
        lblItem.ClientIDMode = ClientIDMode.Predictable; 
        container.Controls.Add(lblItem); 

        DropDownList ddl = new DropDownList(); 

        ddl.DataBinding += new EventHandler(ddl_DataBinding); 
        ddl.ID = "ddl" + _columnName; 
        ddl.Visible = false; 
        container.Controls.Add(ddl); 
        break; 


      } 
     } 

}

Теперь я хочу получить доступ к этикетке и выпадающий список, который я добавил, используя этот код. когда я делаю gridviewrow.findcontrol ("id"), я не получаю их. Может кто-нибудь, пожалуйста, помогите мне.

Я geeting, когда я иду через все строки и попытаться найти, но у меня есть флажок в строке, когда я выбираю его все метки должны diappear и DDLS dhould появляются для этого я использую происходит некорректно код.

protected void chkEdit_CheckedChanged(object sender, EventArgs e) { CheckBox chkEditTest = (CheckBox)sender; GridViewRow grow = (GridViewRow)chkEditTest.NamingContainer; DropDownList ddl = (DropDownList)grow.FindControl("ddl"); Label lbl= (Label)grow.FindControl("lbl"); }

, когда я делаю это я не в состоянии получить контроль. похоже контролей disapppearing на постбэка ..

ответ

0

Это то, что я придумал, и я могу иметь возможность получить ссылку управления в код.

public class CustomGridViewColumn : ITemplate 
    { 
    ListItemType _liType; string _columnName; 

    public CustomGridViewColumn(ListItemType type, string column) 
    { 
     _liType = type; 
     _columnName = column; 

    } 

    void ITemplate.InstantiateIn(Control container) 
    { 
     switch (_liType) 
     { 
      case ListItemType.Header: 
       Label lblHeader = new Label(); 
       lblHeader.Text = _columnName; 
       container.Controls.Add(lblHeader); 
       break; 
      case ListItemType.Item: 
       Label lblItem = new Label(); 
       lblItem.DataBinding += new EventHandler(lblItem_DataBinding); 
       lblItem.ID = "lbl" + _columnName; 
       lblItem.ClientIDMode = ClientIDMode.Predictable; 
       container.Controls.Add(lblItem); 

       DropDownList ddl = new DropDownList(); 

       ddl.DataBinding += new EventHandler(ddl_DataBinding); 
       ddl.ID = "ddl" + _columnName; 
       ddl.Visible = false; 
       ddl.DataSource = new string[] { "Hello", "World" }; 
       container.Controls.Add(ddl); 
       break; 


     } 
    } 

    void ddl_DataBinding(object sender, EventArgs e) 
    { 

    } 

    void lblItem_DataBinding(object sender, EventArgs e) 
    { 

    } 

} 

protected void Page_Load(object sender, EventArgs e) 
{ 

    DataTable dt = new DataTable(); 
    dt.Columns.Add("Name"); 
    DataRow oItem = dt.NewRow(); 
    oItem[0] = "Deepu"; 
    dt.Rows.Add(oItem); 
    oItem = dt.NewRow(); 
    oItem[0] = "MI"; 
    dt.Rows.Add(oItem); 
    GridView gv = new GridView(); 
    gv.ID = "myGridView"; 
    gv.AutoGenerateColumns = false; 
    BoundField nameColumn = new BoundField(); 
    nameColumn.DataField = "Name"; 
    nameColumn.HeaderText = "Name"; 
    gv.Columns.Add(nameColumn); 

    TemplateField TmpCol = new TemplateField(); 
    TmpCol.HeaderText = "Template Column"; 
    gv.Columns.Add(TmpCol); 
    TmpCol.ItemTemplate = new CustomGridViewColumn(ListItemType.Item, "TEST"); 
    gv.DataSource = dt; 
    gv.DataBind(); 
    Form.Controls.Add(gv); 


} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    GridView gv = Form.FindControl("myGridView") as GridView; 
    foreach (GridViewRow item in gv.Rows) 
    { 
     var ddl = item.FindControl("ddlTest") as DropDownList; 
     if (ddl != null) 
     { 
      ddl.Visible = true; 
     } 

     var lbl = item.FindControl("lbl") as Label; 
     if (lbl != null) 
     { 
      lbl.Text = "hello"; 
     } 
    } 
} 

<form id="form1" runat="server"> 


<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> 


</form> 

Благодаря

Дипу

+0

Это прекрасно работает. Но то, что я наблюдал при отладке, - это когда после обратной связи происходит потеря элементов управления шаблоном. Могу ли у вас взглянуть на мои изменения в сообщении. – siri

-2

Вы можете попробовать использовать индекс строки управления GridView

var rowIndex = int.Parse(e.CommandArgument) 
GridView1.Rows[rowIndex].FindControl("id") 

относятся также

http://forums.asp.net/t/998368.aspx/1

http://www.codeproject.com/Articles/12021/Accessing-the-different-controls-inside-a-GridView

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewrow.aspx

Благодаря

Дипу

+0

Это прекрасно работает для элементов управления, добавленных из ASPX. Я хочу, когда поле шаблона добавляется динамически .. – siri

+0

Это не то, что я ищу .. – siri