2011-07-05 26 views
0

バインドしたいLinqの結果をDataGridに持っていますので、結果を編集できます。私が間違っていることについて助言してください。以下は、私のC#コードです:LINQ結果をDataGridにバインド

  var root = XElement.Parse(xmlText); 
      var elementsThatCanBeEmpty = new HashSet<XName> 
      { 
       XName.Get("Login"), 
       XName.Get("CustomerStreet2"), 
       XName.Get("PayeeStreet2"), 
       XName.Get("PayAsName"), 
       XName.Get("PayeeAccount") 
      }; 

      var transactionList = 
       from transactions in root.Elements(XName.Get("Transactions")).Elements().AsEnumerable() 
       where transactions.Elements().Any 
        (
         el => 
         String.IsNullOrEmpty(el.Value) && 
         !elementsThatCanBeEmpty.Contains(el.Name) 
        ) 
       select transactions; 

       foreach (var t in transactionList) 
       { 
        Response.Write(t.Element(XName.Get("CustomerName")).Value); 
       } 

       dgBillPay.DataSource = transactionList; 
       dgBillPay.DataBind(); 

私はページを実行すると、データグリッドは "ValueXmlHasAttributesHasElementsIsEmptyValueBaseUri" のヘッダーがあります。私はここで間違って何をしていますか?お知らせ下さい。

答えて

0

コードの外観から。 LINQクエリに基づいてDataGridにXmlElementsのコレクションをバインドしているようです。あなたが合うように選択部分に必要事項を記入後、

 var transactionList = 
      from transactions in root.Elements(XName.Get("Transactions")).Elements().AsEnumerable() 
      where transactions.Elements().Any 
       (
        el => 
        String.IsNullOrEmpty(el.Value) && 
        !elementsThatCanBeEmpty.Contains(el.Name) 
       ) 
      select new { CustomerName = transactions.Element(XName.Get("CustomerName")).Value}; 

そして:

は、私はあなたがこのような何かをしたいかもしれないと思います。

2

通常、asp.netコントロールのデータバインディングは、データソースとして提供されるオブジェクトのリストのプロパティを調べることによって機能します。

この場合、データグリッドは自動的に列を生成するように設定されています。つまり、渡されたオブジェクトのプロパティに基づいてヘッダが自動的に生成されます。ここではIEnumerable<XElement>を渡しているので、プロパティリストをバインディングリストとして使用しています。

  1. anonymous typeを作成するために、あなたのLINQ文の中での選択を使用し、あなたが行くように適切な値に名前を付ける:ここ

    あなたのオプションがします。

  2. ヘッダーにする名前でローカルにプライベートクラスを作成します。
  3. 旧学校に行き、DataTableを使用してください。これらは、列ヘッダー名をプログラムで設定できるだけでなく、他の「機能」の長いリストを設定できるという点で少なくとも有用です。
  4. データバインドコントロールのマークアップで列名を手動で設定し、ItemDataBoundイベントをオーバーライドして、正しいデータを自分で配置する処理を行います。 BoundFieldDataGrid.ItemDataBoundのページを参照してください。

ここでは、匿名のタイプがおそらく最も抵抗の少ないパスです。

0

あなたが見ている問題は、コントロールにバインドする前にクエリ結果を列挙したためです。

foreach (var t in transactionList) 
{ 
    Response.Write(t.Element(XName.Get("CustomerName")).Value); 
} 

この文が実行されると、queryが再度実行されない限り、transactionListは他のものでは使用できないと確信しています。

もう1つのことは、クエリでToList()を呼び出すことによって、transactionListクエリ結果をリストに変換することです。

この2つのことを試してみてください。

関連する問題