この質問が以前に行われたことがある場合は申し訳ありませんが、探しているものがどこにも見つかりません。
セットアップ: 3つのテーブルを持つMSSQLデータベースがあります
テーブル-FoodInfo
列-FoodId(PK)、DanName
テーブル-CompName
列-CmpId(PK)、CmpName
テーブル-栄養素(ジャンクションテーブル)
列-FoodId(FK)、CmpId(fk)、BestLoc
すべてのDanName行には、約8つのCmpNameが関連付けられ、すべてのCmpNameには、1つのBestLocが関連付けられています。
これにより、WinFormでデータを表示すると、DanNameが8回繰り返されます。
問題は、DanNameを関連するCmpNameとその値とともに1行で表示したいということです。
次のようなもの:DanName-CmpName1-BestLoc値-CmpName2-BestLoc値-CmpName3-BestLoc値..など。
私は解決策について非常に柔軟ですが、どの道をたどるべきかわかりません。DBに、希望どおりのテーブルを作成してDataGridViewに配置する必要がありますか、それともLinq-To-SQLを使用して解決し、リストビューに配置する必要がありますか?
すでに述べたように、私はソリューションについてかなり柔軟です。テキストボックスにデータを入れたくないだけです。また、取得したデータをプログラムの他の場所で使用できるようにしたいと思います。
誰かが解決策を持っているなら、私はそれの例を見たいです。
編集: もう少し詳しく説明し、いくつかのコードサンプルを使用します。
linqを使用した私のDALクラス
void bw_DoWork(object sender, DoWorkEventArgs e)
{
Table<FoodInfo> FoodInfo = db.GetTable<FoodInfo>();
Table<CompName> CompName = db.GetTable<CompName>();
Table<Nutrient> Nutrients = db.GetTable<Nutrient>();
var foods =
from compname in CompName
join nutrients in Nutrients on compname.CompId equals nutrients.CompId
join foodinfo in FoodInfo on nutrients.FoodId equals foodinfo.FoodId
where foodinfo.DanName.StartsWith(searchWord) && (compname.CompId >= 0
&& compname.CompId < 8)
select new { foodinfo.DanName, compname.CmpNamDK, nutrients.BestLoc };
foreach (var food in foods)
{
DanName = food.DanName;
Compname = food.CmpNamDK;
BestLoc = food.BestLoc;
OnSearchResultArgs OSR = new OnSearchResultArgs(DanName, Compname, BestLoc);
onResult(this, OSR);
}
}
これは私のフォームでイベントハンドラーをトリガーし、結果を送信して次のコードを実行します。
listView1.FullRowSelect = true;
listView1.Columns.Add("DanName", 100);
listView1.Columns.Add("CompName", 150);
listView1.Columns.Add("BestLoc", 50);
private void UpdateControls(object sender, OnSearchResultArgs e)
{
var item = new ListViewItem();
item.Text = e.DanName;
item.SubItems.Add(e.CompName);
item.SubItems.Add(e.BestLoc);
listView1.Items.Add(item);
}
UpdateControlが呼び出されていますが、ここに入れる必要はないと思います。
これにより、次のようになります。
それらの8行を1行にしたいと思います。お気に入り: