RE: DataGrid Runtime DropDown - ViewState Issue



Hi Steve,

I think you might misunderstand something. In a datagrid, a datagrid item
becomes an so-called EditItem only when you assign it as EditItem, e.g. in
Edit event:

DataGrid.EditItemIndex = e.Item.ItemIndex
Datagrid.DataSource = data_source_object
Datagrid.DataBind()

Then the item, index as e.Item.ItemIndex becomes EditItem.

In ItemDataBound event, there are only two kinds of data-bound items,
ListItemType.Item and ListItemType.AlternatingItem.


HTH

Elton Wang
elton_wang@xxxxxxxxxxx


"Steve Pierce" wrote:

>
> I am having some issues with a runtime dropdownlist in a datagrid. The
> issue is that I cannot get ViewState to fill the selected index of a runtime
> dropdown properly on postback. I do not want to use template columns as they
> seem to be a little difficult to create at runtime. Any assistance would be
> very greatly appreciated.
>
> private void DataGrid1_ItemDataBound(object sender,
> System.Web.UI.WebControls.DataGridItemEventArgs e)
> {
> if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
> ListItemType.AlternatingItem)
> {
> // display all LooId values with related value in LookupValue for display
> foreach (LookupProperties lp in GetLookupCollection().Items)
> {
> // set the text of the cell based on the dataset
> DataRow dr = ((DataRowView)e.Item.DataItem).Row;
> int lovId = Convert.ToInt32(dr[lp.ColumnName]);
> e.Item.Cells[lp.ColumnIndex].Text = GetLookupValue(lovId);
> }
> }
> else if (e.Item.ItemType == ListItemType.EditItem)
> {
> // change all LooId columns from textbox to dropdownlist for edit
> foreach (LookupProperties lp in GetLookupCollection().Items)
> {
> // create and populate dropdownlist
> DataRow dr = ((DataRowView)e.Item.DataItem).Row;
> string controlName = "ddl_" + dr[dr.Table.PrimaryKey[0]] + "_" +
> lp.ColumnIndex;
> DropDownList ddl = new DropDownList();
> ddl.ID = controlName;
> ddl.CssClass = "DropDownList";
> ddl.EnableViewState = true;
> foreach (LookupValueRow lov in FrameworkDataSet.LookupValue)
> if (lov.LovLolId == lp.LolId && lov.LovId > 0)
> ddl.Items.Add(new ListItem(lov.LovDisplayValue, lov.LovId.ToString()));
> // select current value based on dataset
> ddl.SelectedValue = dr[lp.ColumnName].ToString();
> // replace default textbox control with new dropdownlist
> e.Item.Cells[lp.ColumnIndex].Controls.Clear();
> e.Item.Cells[lp.ColumnIndex].Controls.AddAt(0, ddl);
> ViewState[controlName] = e.Item.Cells[lp.ColumnIndex].Controls[0].UniqueID;
> }
> }
> }
> private void DataGrid1_ItemCommand(object source,
> System.Web.UI.WebControls.DataGridCommandEventArgs e)
> {
> if ((e.Item.ItemType == ListItemType.Header) ||
> (e.Item.ItemType == ListItemType.Footer) ||
> (e.Item.ItemType == ListItemType.Separator))
> return;
> if (e.CommandName != "Update")
> return;
> // update dataset for all LooId columns with dropdownlist selectedvalue
> foreach (LookupProperties lp in GetLookupCollection().Items)
> {
> // compare dropdownlist selectedvalue to dataset, update if changed
> int verId = Convert.ToInt32(DataGrid1.DataKeys[e.Item.ItemIndex]);
> DataRow dr = PageDataSet.Version.FindByVerId(verId);
> string controlName = "ddl_" + verId + "_" + lp.ColumnIndex;
> string uniqueName2 = ViewState[controlName].ToString();
> // error: selecteditems are not correct from viewstate
> DropDownList ddl = new DropDownList();
> ddl.ID = controlName;
> ddl.CssClass = "DropDownList";
> ddl.EnableViewState = true;
> foreach (LookupValueRow lov in FrameworkDataSet.LookupValue)
> if (lov.LovLolId == lp.LolId && lov.LovId > 0)
> ddl.Items.Add(new ListItem(lov.LovDisplayValue, lov.LovId.ToString()));
> e.Item.Cells[lp.ColumnIndex].Controls.Clear();
> e.Item.Cells[lp.ColumnIndex].Controls.AddAt(0, ddl);
> DropDownList ctl1 = (DropDownList)e.Item.Cells[lp.ColumnIndex].Controls[0];
> DropDownList ctl2 = (DropDownList)e.Item.FindControl(controlName);
> DropDownList ctl3 = (DropDownList)this.FindControl(uniqueName2);
> if (ddl.SelectedItem == null)
> {
> if (dr[lp.ColumnName].GetType() != typeof(DBNull))
> dr[lp.ColumnName] = DBNull.Value;
> else
> continue;
> }
> else
> {
> if (dr[lp.ColumnName].GetType() == typeof(DBNull))
> dr[lp.ColumnName] = ddl.SelectedValue;
> else if (dr[lp.ColumnName].ToString() != ddl.SelectedValue)
> dr[lp.ColumnName] = ddl.SelectedValue;
> else
> continue;
> }
> }
> }
>
> Steve Pierce
> Sterling Computer Consultants
> stevep@xxxxxxxxxxxxxx
>
>
>
.



Relevant Pages

  • Re: DataGrid Runtime DropDown - ViewState Issue
    ... foreach.Items) ... > dropdown properly on postback. ... > foreach (LookupProperties lp in GetLookupCollection().Items) ... > // update dataset for all LooId columns with dropdownlist selectedvalue ...
    (microsoft.public.dotnet.framework.aspnet)
  • DataGrid Runtime DropDown - ViewState Issue
    ... dropdown properly on postback. ... foreach (LookupProperties lp in GetLookupCollection().Items) ... // update dataset for all LooId columns with dropdownlist selectedvalue ...
    (microsoft.public.dotnet.framework.aspnet)
  • Re: wie eine unbekannte Anzahl DropDownList Felder durchlaufen?
    ... Google mal nach dynamischen Controls ... Ich habe in einem Panel (PanelSpalten) eine mir unbekannte Anzahl DropDown Elemente erzeugt. ... Aber leider happert es schon in der Foreach weil PanelSpalten nicht mit Foreach durchlaufen werden kann. ...
    (microsoft.public.de.german.entwickler.dotnet.csharp)
  • wie eine unbekannte Anzahl DropDownList Felder durchlaufen?
    ... Ich habe in einem Panel (PanelSpalten) eine mir unbekannte Anzahl DropDown Elemente erzeugt. ... Aber leider happert es schon in der Foreach weil PanelSpalten nicht mit Foreach durchlaufen werden kann. ... Im folgenden der Code mit welchem ich die DropDowns erzeugt habe. ...
    (microsoft.public.de.german.entwickler.dotnet.csharp)

Loading