4


2

Repeater.ItemsのDataItemは常にnullです

リピーターのDataSourceをListに設定しています(MyProductsはget / setterのみで構成される単純なクラスです)。

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

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


より多くのコード:

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 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です。 値が必要ですよね? screenshot

'' '' '

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

ユーザーが数量の値を編集した後、MyProductsの新しい数量を保存したかった。 MyProductsのidを保持するhiddenfieldを配置することで解決し、手動で検索してそこからMyProductsオブジェクトを取得できるようにしました。

emremp、Mark Avenius、およびピッチに参加したすべての人に感謝します。

2 Answer


5


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

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

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

public List TheProducts
{
 get
 {
     if(Session[MYPRODUCTSKEY] == null)
         Session[MYPRODUCTSKEY] = //invoke webservice
     return Session[MYPRODUCTSKEY] as List;
 }
}


2


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

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