ポストバックにより、GridView列のユーザーコントロールが破壊されます
-
05-07-2019 - |
質問
テンプレート列とユーザーコントロールを使用してデータグリッドを動的に構築できるASP.NET GridViewがあります。現在、行を挿入するためのイベントハンドラを実装しています。そのために、デフォルト値の配列を作成し、データソースとして機能するデータテーブルに追加します。ただし、ポストバックでOnLoadイベントが発生すると、すべてのテンプレート列にユーザーコントロールがなくなります。グリッドビューは、何も入っていないすべてが空白になり、ボタン列も消えます(行の追加、行の削除、保存ボタンが含まれます)。
行追加イベントはこれを行うだけです:
public void AddDataGridRow()
{
List<object> defRow = new List<object>();
for (int i = 0; i < fieldNames.Count; i++)
{
defRow.Add(GetDefaultValueFromDBType(types[i]));
}
dt.Rows.Add(defRow);
}
次のように実装されているユーザーコントロールのボタンから起動されます。
protected void Button1_Click(object sender, EventArgs e)
{
((Scoresheet)(this.Page)).AddDataGridRow();
}
私のon loadイベントは、GridViewを設定するために最初の実行時に多くの処理を行いますが、IsPostBackプロパティを使用して再度実行することはありません。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Initialize();
}
ユーザーコントロールが消える理由について、誰にもヒントがありますか?
解決
(!Postback)だけでなく、page_loadごとにグリッドにコントロールを追加する必要があります
他のヒント
ユーザーコントロールとGridViewでEnableViewState = trueを持っていますか?
Initialize()によってAddDataGridRow()メソッドが呼び出されますか?基本的に2つのオプションがあります:
- すべてのポストバックでグリッドをバインドし、ビューステートを使用しない(パフォーマンスの低下)
- グリッドを初めてバインドする場合(if(!IsPostBack))、ユーザーコントロールが必ずビューステートを維持するようにします。
コードから、ユーザーコントロールがビューステートを保持しているかどうか、およびそれらに何があるかは明確ではありません。示したメソッドの実行順序は明らかではありません。バインドロジックはないため、行を追加し続けてもグリッドはバインドされない場合があります。少し詳しく説明し、ページ全体のコードビハインドを表示してください。