質問

テンプレート列とユーザーコントロールを使用してデータグリッドを動的に構築できる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つのオプションがあります:

  1. すべてのポストバックでグリッドをバインドし、ビューステートを使用しない(パフォーマンスの低下)
  2. グリッドを初めてバインドする場合(if(!IsPostBack))、ユーザーコントロールが必ずビューステートを維持するようにします。

コードから、ユーザーコントロールがビューステートを保持しているかどうか、およびそれらに何があるかは明確ではありません。示したメソッドの実行順序は明らかではありません。バインドロジックはないため、行を追加し続けてもグリッドはバインドされない場合があります。少し詳しく説明し、ページ全体のコードビハインドを表示してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top