Динамическая привязка евента DropDownList в DataGrid
От: ForAll_k  
Дата: 15.02.05 17:20
Оценка:
public void TmpGD_ItemDataBound(object sender, DataGridItemEventArgs e)
{
DataRowView rec = null;
if(e.Item.ItemType ==ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem ||
e.Item.ItemType == ListItemType.SelectedItem || e.Item.ItemType == ListItemType.EditItem)
rec =(DataRowView) e.Item.DataItem;
switch(e.Item.ItemType)
{
case ListItemType.Item:
case ListItemType.AlternatingItem:
case ListItemType.SelectedItem:
case ListItemType.EditItem:
if (e.Item.ItemIndex==TmpGD.EditItemIndex)
{
if (TmpGD.EditItemIndex!=-1)
{
DataView dvRef = (DataView)Context.Cache["Ref_cash"];
if(dvRef == null)
{
dvRef = new DataView(new WebGenerator.cl_db().Get_datatset("","SELECT t_sys_base.[F_REF_METHOD],Q_SYS_BASE.[name] FROM Q_SYS_BASE RIGHT JOIN T_SYS_BASE ON Q_SYS_BASE.colid=t_sys_base.F_SYS_COLID where t_sys_base.f_type=2").Tables[0]);
Context.Cache.Insert("Ref_cash", dvRef, null, DateTime.Now.AddHours(0.2), TimeSpan.Zero);
}
int ii=1;
foreach (DataColumn field_name in rec.DataView.Table.Columns)
{
ii=ii+1;
dvRef.RowFilter="[name]='" + field_name.ColumnName+"'";
if(dvRef.Count > 0)
{
// DataView dvRefSel = (DataView)Context.Cache["Ref_Sel_cash"];
// if(dvRefSel == null)
// {
DataView dvRefSel = new DataView(new WebGenerator.cl_db().Get_datatset("","SELECT * FROM " + dvRef[0]["F_REF_METHOD"].ToString()).Tables[0]);
Context.Cache.Insert("Ref_Sel_cash", dvRefSel, null, DateTime.Now.AddHours(0.2), TimeSpan.Zero);
// }
e.Item.Cells[ii].Controls.Clear();
// DropDownList ddlOrder = (DropDownList) e.Item.FindControl("Cbo");
// if (ddlOrder!=null)
// {
DropDownList ddlOrder = new DropDownList();
// e.Item.Cells[ii].Controls.Clear();
ddlOrder.Items.Add(new ListItem("Данные...", ""));
foreach(DataRow rr in dvRefSel.Table.Rows)
{
ddlOrder.Items.Add(new ListItem(rr[1].ToString(), rr[0].ToString()));
}
if(ddlOrder.Items.FindByValue(rec[field_name.ColumnName].ToString()) != null)
ddlOrder.Items.FindByValue(rec[field_name.ColumnName].ToString()).Selected = true;
// ddlOrder.ID=field_name.ColumnName;
// ddlOrder.SelectedIndexChanged+=new System.EventHandler(this.dropDownList_IndexChanged);
ddlOrder.AutoPostBack=true;
// ViewState[field_name.ColumnName]=ddlOrder.ID;
// Context.Cache.Insert("ddlOrder", ddlOrder, null, DateTime.Now.AddHours(0.2), TimeSpan.Zero);
ddlOrder.SelectedIndexChanged += new EventHandler(dropDownList_IndexChanged);

e.Item.Cells[ii].Controls.Add(ddlOrder);

}
}
}
}
((LinkButton) e.Item.Cells[1].Controls[0]).Attributes.Add("onclick", "return confirm('Вы уверены?');");
break;
case ListItemType.Footer:
break;

}

}
public void dropDownList_IndexChanged(object sender, EventArgs e)
{
FillControls();

}
}

Есть грид TmpGD туда в событии ItemDataBound добавляются дробдауны и заполняются в зависимсоти
от данных, Там же пытаюсь прибиндить евенты на dropDownList_IndexChanged, все хорошо добавляется и при редактировании все что нужно. Но вот событие не при при выборе в комбобоксе не просиходит!
и выдается ошибка: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request

Может кто то сталкивался с подобным, подскажите!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.