10


0

ASP.NET / DataListのDataItemがポストバック後nullです

ASP.NETフォームでポストバック(ボタンをクリック)した後、フォームのすべてのDataItemがnullです。 Why? ポストバック後でも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;
    }

3 Answer


9


私の答えを見つけましたhttp://www.dotnetmonster.com/Uwe/Forum.aspx/asp-net-web-controls/4282/On-post-back-repeater-s-Item-DataItem-are-all-null[here ]。

_ _ ジョンが言ったように、データソース項目はデータバインドされたときにのみ利用可能です。 それらは、最初のロード後にアクセスできなくなります。

グリッドを使用して更新する画面上のデータを表すオブジェクトまたはオブジェクトコレクションを作成し、そこからデータベースへの変更を保持することを検討できます。 _ _

より正確には、HiddenFieldを使用して投稿全体にIDを保存し、DataItemから取得するのではなく、データベースにデータを要求します(データバインドイベントの外部では使用できません)。

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


7


`DataItem`はデータバインディングの場合のみ利用可能です。

「ロード」は「クリック」の前にあるため、データは上書きされます。

これを行う:

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

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

更新/アドバイス:

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


1


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