DropDownList.SelectedIndexChanged отображает код, сгенерированный GridView неправильно (удваивается, утраивается и т. Д.) - PullRequest
0 голосов
/ 19 октября 2010

У меня есть выпадающий список, который контролирует содержимое 3-х элементов управления gridview.Они используются в веб-части.Однако каждый раз, когда метод selectedindexbound из выпадающего списка запускает событие, содержимое зависимых представлений сетки добавляет другую визуализацию вида сетки.Следовательно, он удваивает и даже утраивает содержимое этих видов сетки.

У меня есть следующие коды:

-> для метода 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 />"));

-> дляметод 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);
}

-> для одного из элементов управления 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 определяет только атрибуты видов сетки.Может кто-нибудь, пожалуйста, помогите мне в этой некорректной проблеме рендеринга?Спасибо.

1 Ответ

0 голосов
/ 19 октября 2010

CreateChildControls и ddl_SelectedIndexChanged будут оба запущены, когда элемент будет выбран из выпадающего списка, и поэтому метод ProfileGrid добавит все дочерние элементы управления в каждый GridView дважды, когда это произойдет.Я не уверен, почему это когда-либо приведет к тому, что все будет утроено.

Вам не нужно заново создавать макет сетки в событии SelectedIndexChanged, оно уже создано в CreateChildControls.Вам нужно только установить источник данных.Разбейте первые четыре строки кода в ProfileGrid (..) и вызывайте только это, когда выбран элемент списка выбора.

В идеале вы не должны привязывать данные дважды, например, вам не следует привязывать данные в CreateChildControls, если вы не уверены, что это не произойдет в SelectedIndexChanged.Например, вы можете пропустить привязку данных там, если это обратная передача, предполагая, что нет другой причины, по которой страница будет опубликована.Но это все равно будет работать в любом случае, просто избыточно / неэффективно.

...