web-dev-qa-db-ja.com

ドロップダウンリストに表示する2つのフィールドを連結する

リストの2つのフィールドを連結して、ドロップダウンに表示しようとしています。以下は私が使用しようとしているコードです。私は製品のモデルを変更したくないので、以下のようなことを試みましたが、フィールドを連結して自分のオブジェクトを構築しないと何も理解できません。

            skuDropDown.DataSource = List<product>
            skuDropDown.DataTextField = "ProductId" // want to combine with"Description";
            skuDropDown.DataValueField = "ProductId";
            skuDropDown.DataBind();

どんなアイデアも助けてくれてありがとう。

16
Locke12

特定のメソッドでソースを割り当てるには、LINQを使用して、必要なプロパティを持つ匿名型を作成します。何かのようなもの

List<Product> products = new List<Product>();
products.Add(new Product() { ProductId = 1, Description = "Foo" });
products.Add(new Product() { ProductId = 2, Description = "Bar" });

var productQuery = products.Select(p => new { ProductId = p.ProductId, DisplayText = p.ProductId.ToString() + " " + p.Description });

skuDropDown.DataSource = productQuery;
skuDropDown.DataValueField = "ProductId";
skuDropDown.DataTextField = "DisplayText";
skuDropDown.DataBind();
29
Anthony Pegram

製品を表すクラスがある場合は、クラスを拡張して組み合わせて返すプロパティを作成するだけです。たとえば、

        public string ID_Description {
            get 
            {
               return string.Format("{0} ({1})", Name, ProductId);
            }
        }

そして、あなたのデータバインドドロップダウンであなたのプロパティを参照してください

skuDropDown.DataSource = productQuery;     
skuDropDown.DataValueField = "ProductId";     
skuDropDown.DataTextField = "ID_Description";     
skuDropDown.DataBind(); 
5
Diego Mendes

あなたはこれを行うことができます:

List<Product>.ForEach(
  x => skuDropDown.Items.Add(
    new Item(x.ProductId + " " x.ProductDescription, x.ProductId)
 );

リストをループして、各項目をドロップダウンリストに追加するだけです。これは、例の裏で.netが行うことです。

1
kemiller2002

製品を拡張する新しいクラスを作成し、Listコンテンツを拡張クラスとしてキャストします。これには、ProductIDとDescriptionの連結値を返す新しいプロパティが含まれます。

OTOMHでうまくいくと思います。

私はあなたが製品構造を変更したくないことを知っているので、私は拡張クラスを作ることを提案しました。しかし、それをオブジェクトのフィールドにバインドしないと不可能です。

0
Psytronic

残念ながら、データバインディングを使用している場合、DataTextFieldはデータソースのフィールドの名前でなければなりません。

できることの1つは、ドロップダウンリストの項目をバインドし、それらのTextプロパティを変更した後、項目を反復することです。他にすべきことは、連結されたフィールドをデータオブジェクトに追加することだけです。

0
womp

必要なのは、製品の.ToString()メソッドをオーバーライドすることだけです。

public override string ToString()
{
    return ProductID + " " + ProductDescription;
}

次に、ドロップダウンにバインドするだけです。私の理解では、ドロップダウンラベルは、それがバインドされているコレクション内のオブジェクトのtostring()にバインドされています。

つまり、これを行います。

List<Product> products = new List<Product>();     
products.Add(new Product() { ProductId = 1, Description = "Foo" });     
products.Add(new Product() { ProductId = 2, Description = "Bar" });     

var productQuery = products.Select(p => new { ProductId = p.ProductId, DisplayText =   p.ProductId.ToString() + " " + p.Description });     

skuDropDown.DataSource = productQuery;     
skuDropDown.DataBind();  
0
priehl