2012-05-04 11 views
1

lineオブジェクトを作成して、エンティティであるTagsナビゲーションプロパティを設定したいとします。問題とエンティティに子エンティティコレクションを追加するには、データグリッドビューで選択した行を使用してください。

​​

コード::私はこれがTagオブジェクトにバインドされたDataGridViewからコレクションをタグ取得したい5種類の変換はできません

エラー:行がエラーを示している

Line l = new Line 
{ 
    Part = o.Part, 
    Description = desc, 
    Price = o.Price.Value, 
    InvoiceNo = o.InvoiceNo, 
    Cost = o.Cost.Value, 
    Comments = txtComment.Text, 
    Tags = dgvTags.SelectedRows as List<Tag> // <--- needs work here 
        }; 

'System.Windows.Forms.DataGridViewSelectedRowCollection'から 'System.Collections.Generic.List'に参照変換、ボクシング変換、unboxing変換、折り返し変換、またはnull型変換C:\ SVN \ RS \ fAddLines.cs 142 15 RS

正しい方法がありますか?

UPDATE:

アイブ以下のコードで望ましい結果をacheiveすることができて、まだそれを行うには正しい方法を探して:

foreach (DataGridViewRow r in dgvTags.SelectedRows) 
{ 
    l.Tags.Add(r.DataBoundItem as Tag); 
} 
+0

あなたは答えとしてではなく、あなたの質問にアップデートとして働いてきたコードを投稿することができます。これはStackOverflowに関するあなた自身の質問にソリューションを投稿するより一般的な方法です。 –

答えて

2

クレジットデビッド・ホールに、彼は非常に懸命に試みたが、最終的に以下のコードは、最も簡単な解決策だった:

foreach (DataGridViewRow r in dgvTags.SelectedRows) 
{ 
    l.Tags.Add(r.DataBoundItem as Tag); 
} 
1

これはどここれらのケースの一つであります問題を解決する方法はたくさんあります。私が下に示したコードは、ベストではないかもしれませんが、SelectedRowsコレクションから型付きオブジェクトのリストを取得するために機能します。

IList<Tag> myrows = dataGridView1.SelectedRows.Cast<DataGridViewRow>().Select(x => x.DataBoundItem as Tag).ToList(); 

これは、LINQのを使用し、基本的にあなたの方法と同じである、LINQのはただのforeachを除去することによって、少し物事を体裁が整い。


あなたがあなたのコメントに持っている問題は、LINQのとSystem.Data.Objects.DataClasses.EntityCollection<T>によって作成System.Collections.Generic.List<T>の間には暗黙のconverstionです。

私は、これは動作するはずと信じています:

Tags = new System.Data.Objects.DataClasses.EntityCollection<RS.Tag>(
    dataGridView1.SelectedRows.Cast<DataGridViewRow>() 
    .Select(x => x.DataBoundItem as Tab).ToList()); 

私は私だけEntityCollection<T>BindingList<T>ないに変換してテストしてみたので、信じていると言います。


EntityCollectionには、リスト全体を割り当てる方法がありません。 convert or cast a List<t> to EntityCollection<T>私は次のコードを思いついた:ここにこの質問から

dataGridView1.SelectedRows.Cast<DataGridViewRow>() 
    .Select(x => x.DataBoundItem as Tab).ToList().ForEach(y => Tags.Add(y)); 

私はおそらく、この時点でこのonelinerの上にバニラForEachを好むだろう。

+0

@MuhammadA私はその問題に対する答えを編集しました。新しいEntityCollectionリストを作成する必要があります。 –

+0

残念ながら、EntityCollectionには引数を取るコンストラクタがないため、新しい方法は不可能です。 – sprocket12

+1

@MuhammadA本当ですか? lol、ok、yuck :)私はlinqにビットを追加していますが、それでも一行の答えは得られますが、個人的には非常に多くの連鎖式があるので、foreachが読みやすくなります!誰もが同じことをしたいと思ったときに答えを残して、コンストラクターの引数を取るリストを使用しています。 –

関連する問題