2014-09-05 2 views
0

Я использую Gridview с AutoGenerateColumns = «True», поэтому столбцы gridview генерируются динамически. Теперь в случае редактирования я добавляю dropdownlist динамически для одного из полей в gridview. Пожалуйста, смотрите следующий код:Доступ к динамически генерируемому выпадающему списку в событии Gridview_RowUpdating

protected void grdViewConfig_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     grdViewConfig.EditIndex = e.NewEditIndex;    
     BindGridView(); 

     clientBAL = new TMIWsBALClient(); 
     var lstAppIds = clientBAL.GetDistinctApplicationIds(); 

     GridViewRow grdRow = grdViewConfig.Rows[e.NewEditIndex]; 

     for (int i = 0; i < grdRow.Cells.Count; i++) 
     { 
      if (grdRow.Cells[i].GetType().Equals(typeof(DataControlFieldCell))) 
      { 
       DataControlFieldCell dcField = (DataControlFieldCell)grdRow.Cells[i]; 
       if (dcField.ContainingField.HeaderText.ToLower().Equals("applicationid")) 
       {       

        DropDownList drpDwnAppIds = new DropDownList(); 
        drpDwnAppIds.ID = "drpDwnAppIds"; 
        drpDwnAppIds.DataSource = lstAppIds;       
        drpDwnAppIds.DataBind(); 

        var tb = dcField.GetAllControlsOfType<TextBox>(); ;// grdRow.Cells[i].GetAllControlsOfType<TextBox>(); 
        TextBox firstTb = (TextBox)tb.First();       
        foreach (ListItem lstItem in drpDwnAppIds.Items) 
        { 
         if (firstTb.Text.Equals(lstItem.Text, StringComparison.CurrentCultureIgnoreCase)) 
         { 
          lstItem.Selected = true; 
         } 
        } 

        dcField.Controls.Remove(firstTb); 
        dcField.Controls.Add(drpDwnAppIds); 
       } 
      }    

     }    

    } 

Сейчас в Gridview_RowUpdating случае, я пытаюсь принести DropDownList подобным образом, но я не могу получить его. GetAllControlsOfType() - это метод расширения, который возвращает все дочерние элементы управления под выбранным родителем. В этом случае родителем является ячейка gridview, а дочерний элемент управления - выпадающий список. Но он возвращает null.

protected void grdViewConfig_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     strTableName = txtTable.Text.Trim(); 

     string strAppId; 
     GridViewRow grdRow = grdViewConfig.Rows[grdViewConfig.EditIndex]; 

     for (int i = 0; i < grdRow.Cells.Count; i++) 
     { 
      if (grdRow.Cells[i].GetType().Equals(typeof(DataControlFieldCell))) 
      { 
       DataControlFieldCell dcField = (DataControlFieldCell)grdRow.Cells[i]; 
       if (dcField.ContainingField.HeaderText.ToLower().Equals("applicationid")) 
       { 
        var drpDwn = dcField.GetAllControlsOfType<DropDownList>(); 
        DropDownList drpDwnAppIds = (DropDownList)drpDwn.First(); 
        strAppId = drpDwnAppIds.SelectedValue; 
       } 
      } 

     }   

    } 

Что мне не хватает? Пожалуйста помоги. Также дайте мне знать, нужна ли дополнительная информация.

Заранее спасибо.

ответ

0

Динамически сгенерированные элементы управления необходимо воссоздавать при каждой обратной передаче. В вашем случае элементы управления DropDownList, которые вы создали, больше не существуют, когда вы нажимаете обработчик grdViewConfig_RowUpdating.

Как правило, в этом случае вы должны установить AutoGenerateColumns в false и вручную определить свои столбцы, которые позволят вам определить TemplateField, который содержит ItemTemplate для режима только для чтения и EditItemTemplate для режима редактирования, который затем может содержать ваш DropDownList.