dropdownlist.selectedIndExexededは、コードを生成したグリッドビューを誤って誤ってレンダリングします(ダブルス、トリプルなど…)
-
09-10-2019 - |
質問
3つのGridViewコントロールの内容を制御するドロップダウンリストがあります。これらはWebパートで使用されます。ただし、ドロップダウンリストの選択された選択メソッドがイベントを発射するたびに、従属グリッドビューの内容がグリッドビューの別のレンダリングを追加します。したがって、それらのグリッドビューの内容を2倍にし、さらには3倍にします。
次のコードがあります。
- > 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コントロールの1つの場合:
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メソッドは、グリッドビューの属性のみを定義します。誰かがこの誤ったレンダリングの問題について私を助けてくれませんか?ありがとう。
解決
CreateChildControlsとDDL_SelectedIndexChangedは両方ともドロップダウンリストからアイテムが選択されたときに実行されるため、ProfileGridメソッドは、これが発生したときに各GridViewにすべての子供コントロールを2回追加します。しかし、なぜこれが物事が3倍になるのかわかりません。
SelectedIndexChangedイベントでグリッドレイアウトを再作成する必要はありません。これはすでにCreateChildControlsで作成されています。データソースを設定するだけです。 ProfileGrid(..)の最初の4行のコードを分割し、ピックリスト項目が選択されている場合のみを呼び出します。
理想的には、2回もデータを表示しません。たとえば、SelectedIndExchangedで発生しないと確信していない限り、CreateChildControlsでデータビンドでデータを表示すべきではありません。たとえば、ページが投稿される他の理由がないと仮定して、それがポストバックの場合、そこでデータバインディングをスキップできます。しかし、それはどちらの方法でも機能します、それはただ冗長/非効率的です。