10

ASP.NETフォームでポストバック(ボタンをクリック)した後、フォームのすべてのDataItemがnullになります。なんで?ポストバック後もDataListのコンテンツを取得するにはどうすればよいですか?

protected void buttonAddRecord_Click(object sender, EventArgs e)
    {
        foreach (DataListItem item in listFields.Items)
        {
            // item.DataItem == null  WTF?
        }
    }

protected void Page_Load(object sender, EventArgs e)
    {
        BindFields();
    }

private void BindFields()
    {
        object setting = MySettings.GetSetting();

        if (!Null.IsNull(setting))
        {
            listFields.DataSource =     
                DataProvider.GetData(int.Parse(setting.ToString()));
            listFields.DataBind();
        }

        listFields.Visible = listFields.Items.Count > 0;
        emptyMessage.Visible = listFields.Items.Count == 0;
    }
4

3 に答える 3

9

ここで私の答えを見つけました。

ジョンが言ったように、データ ソース アイテムはデータバインドされている場合にのみ使用できます。初期ロード後はアクセスできなくなります。

グリッドで更新する画面上のデータを表すオブジェクトまたはオブジェクト コレクションを用意し、そこからの変更をデータベースに永続化することを検討してください。

より正確には、投稿全体で ID を格納するために HiddenField を使用し、DataItem からデータを取得しようとするのではなく、データベースからデータを要求しました (databinding イベントの外では使用できません)。

HiddenFieldコントロールは、サーバーへのポスト間で永続化する必要がある値を格納するために使用されます

于 2010-08-20T15:58:28.197 に答える
6

DataItemデータバインディングの場合にのみ使用できます。

Load前に来るClickので、とにかくデータを上書きしています。

これを行う:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindFields();
    }
}

DataBindingとUpdate/Insertを処理するには、DataSource(ObjectDataSourceなど)を使用する必要があります。

更新/アドバイス:

PlaceHoldersを使用してデータをバインドすると、問題が発生します。ListView、GridView、DataList、またはRepeaterのいずれかを使用することを検討する必要があります。私はそれらのどれもあなたが望むことをするだろうと確信しています、そしてあなたはより少ないプログラムをしなければならないでしょう。これを機能させるのではなく、時間を使ってそれらを学びましょう。失敗する運命にあります。

于 2010-08-20T14:12:11.687 に答える
0

各ポストバックの後で、本当にDataListをDataBind()するかどうかを確認してください。通常、DataList、GridView、DropDownList(およびその他のコントロール)は、PostBackの後で、再度バインドしないと空になります。

于 2010-08-20T14:08:28.570 に答える