4

リピーターのデータソースをリストに設定しています(MyProductsは単純なクラスであり、get / setterのみで構成されています)。

これとDataBind()の後、デバッグモードで各Repeater.ItemsのDataItemがnullであることがわかります。ポストバックを作成してMyProductsを更新しようとすると、Repeater.Items [n] .DataItemはまだnullであり、Imはそれをキャストできません。

リピーターをデータバインドするときに、各RepeaterItemにDataItemが設定されないのはなぜですか?私は理解できない/グーグルそれを理解する。私のコードの他のすべての側面は正しく機能します(たとえば、MyProductsからaspxにデータを出力します。

<asp:TextBox runat="server" id="q" Text='<%# DataBinder.Eval(Container.DataItem, "Quantity")%>'></asp:TextBox>

その他のコード:

public class MyProducts
    {
        public string Number
        {
            get; set;
        }

        public decimal Price
        {
            get; set;
        }

        public decimal Quantity
        {
            get; set;
        }

        public decimal Total
        {
            get { return Quantity * Price; }
        }
    }

生成:

public List<MyProducts> TheProducts
{
 get { // Invoking webservice, getting response as xml and converting it to a list of MyProducts }
}

私のユーザーコントロール:

// Bind products in cart
r.DataSource = TheProducts;
r.DataBind();
// Debugging "r.Items[n].DataItem" now shows "null", eventhough all objects has been correctly binded

デバッグ情報である#2を編集します。DataSourceは正しくロードされますが、Repeater.Items[3].DataItemはnullです。価値があるはずですよね? スクリーンショット


編集#3、私は今それを手に入れました、私はDataSourceが設定されているときDataItemは常にアクセス可能であり、完全なコードを含めることを考えていなかったと思いました(私はPage_Loadでそれにアクセスしようとしました)。

ユーザーが数量の値を編集した後、MyProductsの新しい数量を保存したいと思いました。MyProductsのIDを保持する隠しフィールドを配置することで解決しました。これにより、手動で検索して、そこからMyProductsオブジェクトを取得できます。

emremp、Mark Avenius、そして参加してくれた他のすべての人に感謝します。

4

2 に答える 2

5

どのような目的でリスト全体が必要ですか?ページがレンダリングされた後、リピーターがバインドされているリストは保持されません。保持する必要がある場合は、セッションに入れて、必要に応じて取得できます(Page_Loadなど)。

private List<MyProducts> _myList;
protected void Page_Load(object sender, EventArgs e)
{
    _myList = Session[MYPRODUCTSKEY] as IList;
}

これをゲッターに入れることもできます(最初にセッションをチェックし、必要に応じてWebサービスを呼び出します)。

public List<MyProducts> TheProducts
{
 get 
 { 
     if(Session[MYPRODUCTSKEY] == null)
         Session[MYPRODUCTSKEY] = //invoke webservice
     return Session[MYPRODUCTSKEY] as List<MyProducts>;
 }
}
于 2010-10-08T13:22:53.387 に答える
2

http://www.netnewsgroups.net/aspnet/t4049-question-repeater-dataitem.aspx

「DataItemは、アイテム作成プロセス、つまりItemCreatedメソッドとItemDataBoundメソッド(DataBindの呼び出しが原因で発生した場合はItemCreated)にのみ存在します。」

ItemDataBoundメソッドを追加して、DataItemの取得を試みることができます。

于 2010-10-08T13:43:24.190 に答える