2

FormView 内に複数選択の ListBox があります。データバインディングをセットアップする方法がわかりません。
リストボックスに問題なく入力できます。リストボックスが単一の選択である場合、私は言うことができSelectValue='<%#Bind("col")%>'、それはうまくいきます。複数選択リストボックスにバインドできるものはありますか? リストボックスの DataBinding イベントを処理し、適切な項目で選択されたプロパティを設定することにより、手動で DataBinding を試みました。残念ながら、DataBinding イベント中はリストボックスに項目がありません。私が見つけた最も近いものは、DataBinding 中にどの項目を選択する必要があるかを決定する値を保存し、FormViews DataBinding イベントでその値を使用して、ハックのように見える適切な項目を選択することです。

より良い方法はありますか?


編集:

自分が今何をしているかを明確にするために...

FormViews の ItemCreated イベントを使用して、FormView の DataItem を保存しています。次に、FormView の DataBound イベントでリストボックスを見つけ、選択した項目を手動で設定します。このように値を保存する必要があるのは正しくないようです。これを行うためのより正しい方法があると思いますが、私にはわかりません。

4

3 に答える 3

0

イベントやってみたItemDataBound

于 2010-04-14T18:35:50.410 に答える
0

過去にこれを行ったとき、リストボックスのデータソースを設定してバインドし、リストボックス内のアイテムのリストを繰り返し処理し、条件または値に一致する各アイテムに対して .Selected を true に設定しました。それが最も効率的かどうかはわかりませんが、私が扱った小さなリストでは、確かにうまくいきました.

于 2010-04-14T21:00:53.513 に答える
0

私がやったことは、 ListBox をすべて一緒に放棄することでした. TreeViewに落ち着きました。

その前に、現在のアイテムを選択するためにこの関数を作成し、Page_PreRender から呼び出しました。これは、バインディングが完了したためであり、必要なコントロールを取得できました。

    protected void SelectCategories()
    {

        ListBox lb = (ListBox)fvProduct.FindControl("lstCategory");

        Product product = (Product)pdc.Products.Where(a => a.Sku == txtSku.Text).FirstOrDefault();
        var c = pdc.ProductCategories.Where(b => b.ProductId == product.ProductId);

        if (lb != null && lb.Items.Count > 0)
        {
            foreach (ProductCategory cat in c)
            {
                foreach (ListItem li in lb.Items)
                {
                    if (cat.CategoryId == Convert.ToInt32(li.Value))
                    {
                        li.Selected = true;
                    }
                } 
            }
        }
    }

そして、ListBox から更新する必要があるときは、FormView.ItemUpdating イベントから次のコードを呼び出しました。

protected void UpdateCategories()
{
    ListBox lb = (ListBox)fvProduct.FindControl("lstCategory");

    Product product = (Product)pdc.Products.Where(a => a.Sku == txtSku.Text).FirstOrDefault();

    if (lb != null && lb.Items.Count > 0)
    {
        foreach (ListItem li in lb.Items)
        {
            ProductCategory pc = new ProductCategory();
            pc = (ProductCategory)pdc.ProductCategories.Where(d => d.CategoryId == Convert.ToInt32(li.Value) && d.ProductId == product.ProductId).FirstOrDefault();

            if (pc == null)
            {
                if (li.Selected == true)
                {
                    //note: if li is selected but pc is null then insert new record .
                    pc = new ProductCategory();
                    pc.ProductId = product.ProductId;
                    pc.CategoryId = Convert.ToInt32(li.Value);
                    pdc.ProductCategories.InsertOnSubmit(pc);
                    pdc.SubmitChanges();
                }
            }
            else
            {
                if (li.Selected == false)
                {
                    //note: if li is not selected but pc is not null then remove record.
                    pdc.ProductCategories.DeleteOnSubmit(pc);
                    pdc.SubmitChanges();
                }
            }
        }
    }
}

これはパフォーマンス的には非常に悪いものでしたが、うまくいきました。linq queryをコンパイルすれば改善できたかもしれませんが、そこまでは行きませんでした。上記のコメントから、問題に対する独自の回避策を見つけた可能性があることを理解しています。そのため、私のような将来の失われた魂を助ける可能性がある場合にのみ、この回答を追加しています.

結局、TreeView は私にとってより良いツールだったので、とにかくこれを行う必要はありませんでした。TreeView を LinqDataSource に簡単にバインドできないため、新しい冒険が始まりましたが、それは別の日の話です。

于 2012-06-20T01:18:40.360 に答える