DropDownList.SelectedIndexChanged渲染代码生成的GridView不正确(双打,三元组等...)

时间:2010-10-19 01:32:23

标签: c# gridview drop-down-menu selectedindexchanged

我有一个下拉列表,用于控制3个gridview控件的内容。这些用于webpart。但是,每次下拉列表的selectedindexchanged方法触发事件时,从属网格视图的内容都会添加另一个网格视图呈现。因此,它会使这些网格视图的内容翻倍甚至三倍。

我有以下代码:

- >用于CreatChildControls方法:

ProfileGrid(_gridProf, _dtProf, _infoObj, _column, _imgColumn, _ddl, _strConn, _id);
Controls.Add(_gridProf);
Controls.Add(new LiteralControl("<br />"));

PhysicalGrid(_gridPhys, _dtPhys, _infoObj, _column, _ddl, _strConn, _id);
Controls.Add(_gridPhys);
Controls.Add(new LiteralControl("<br />"));

LabGrid(_gridLab, _dtLab, _infoObj, _column, _ddl, _strConn, _id);
Controls.Add(_gridLab);
Controls.Add(new LiteralControl("<br />"));

- &gt;用于SelectedIndexChanged方法:

private void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
   ProfileGrid(_gridProf, _dtProf, _infoObj, _column, _imgColumn, _ddl, _strConn, _id);
   PhysicalGrid(_gridPhys, _dtPhys, _infoObj, _column, _ddl, _strConn, _id);
   LabGrid(_gridLab, _dtLab, _infoObj, _column, _ddl, _strConn, _id);
}

- &gt;用于其中一个GridView控件:

private void ProfileGrid(GridView grid, DataTable dt, InfoAccess infoObj, BoundField column, ImageField imgColumn, DropDownList ddl, string strConn, string id)
{
   string query = "exec spr_VITALITY_SCORE '" + id + "', '" +  (ddl.SelectedValue == "" ? DateTime.Now.Year.ToString() : ddl.SelectedValue.ToString()) + "'";

   infoObj.StrConn = strConn;
   dt = infoObj.SQLResult(query);
   grid.DataSource = dt;

   column.DataField = "SCORE";
   column.HeaderText = "Score";
   grid.Columns.Add(column);

   imgColumn.DataImageUrlField = "VITALITY_COLOR";
   imgColumn.DataImageUrlFormatString = "../../Style%20Library/OHImages/{0}";
   imgColumn.HeaderText = "Vitality Color";
   grid.Columns.Add(imgColumn);

   column = new BoundField();
   column.DataField = "VITALITY_DEFINITION";
   column.HeaderText = "Vitality Definition";
   grid.Columns.Add(column);

   column = new BoundField();
   column.DataField = "REMARKS";
   column.HeaderText = "Remarks";
   grid.Columns.Add(column);

   DesignGrid(_gridProf);
   _gridProf.Attributes.Add("Style", "text-align:center;");


 }

DesignGrid方法仅定义gridviews的属性。 任何人都可以帮我解决这个不正确的渲染问题吗? 感谢。

1 个答案:

答案 0 :(得分:0)

CreateChildControls和ddl_SelectedIndexChanged都将在从下拉列表中选择一个项目时运行,因此当发生这种情况时,ProfileGrid方法会将所有子控件添加到每个GridView两次。我不知道为什么这会导致事情增加三倍。

您不需要在SelectedIndexChanged事件中重新创建网格布局,它已在CreateChildControls中创建。您只需要设置数据源。在ProfileGrid(..)中打破前四行代码,并仅在选择了选择列表项时调用它。

理想情况下,你也不会两次数据绑定,例如:你不应该在CreateChildControls中数据绑定,除非你确定它不会发生在SelectedIndexChanged中。例如,如果它是回发,你可以跳过那里的数据绑定,假设没有其他原因将页面发布到。但它仍然可以工作,只是多余/低效。