2010-07-25 44 views
2

在我的DataGridView我顯示了一個表中的一列。在這個表格中,我有一列指向另一個表格中的項目。正如你可能已經猜到的那樣,我想在一列中的網格中顯示第二個表中的一些文本值,而不是ItemID。 我在網上找不到一個正確的例子如何做到這一點。如何在DataGridView中創建LookUp字段?

讓我們假設,我在databes兩個表:

表的用戶:

UserID UserName UserWorkplaceID 
    1  Martin  1 
    2  John   1 
    3  Susannah  2 
    4  Jack   3 

表工作場所:

WorkplaceID WorkplaceName 
    1  "Factory" 
    2  "Grocery" 
    3  "Airport" 

我有一個無類型的數據集dsUsers,一個結合源bsUsers,和兩個用於填充數據集的DataAdaptersdaUsers,daWorkplaces)。對此我進行

代碼:

daUsers.Fill(dsUsers); 
daWorkplaces.Fill(dsUsers); 
bsUsers.DataSource = dsUsers.Tables[0]; 
dgvUsers.DataSource = bsUsers; 

在這一點上我在dgvUsers三列,用戶名,用戶名和UserWorkplaceID看到。然而,而不是UserWorkplaceID和值1,2,3我想看到「工廠」,「雜貨店」等...

所以我已經添加了另一列dgvUsers稱爲「WorkplaceName」,並在我的代碼我試圖將其綁定到新創建的關係:

dsUsers.Relations.Add("UsersWorkplaces", dsUsers.Tables[1].Columns["WorkplaceID"], dsUsers.Tables[0].Columns["UserWorkplaceID"]); 

WorkplaceName.DataPropertyName = "UsersWorkplaces.WorkplaceName"; 

不幸的是,這是行不通的。關係創建時沒有錯誤,但運行該程序後,此列中的字段爲空。

我做錯了什麼?

我想問一個關於DataGridView中的LookUp組合框的例子,它允許我改變UserWorkplaceID而不是數值,它將顯示一個在WorkplaceName下的tex值。

謝謝你的時間。

回答

1

我不知道你是否可以做到你想要的,這似乎是將DataGridView綁定到兩個不同的DataTable實例。我不認爲DataGridView課程支持 - 或者如果它是我沒有見過的忍者風格的移動。

Per MSDN,您最好的選擇是使用DataGridView上的CellFormatting事件,並檢查被格式化的單元格在查找列中,然後您可以用另一個表中的值替換。爲WorkplaceName列使用未綁定的列,隱藏UserWorkplaceID列,然後實現CellFormatting事件句柄以查找行中的值,例如,:

private void dgv_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e) 
{ 
    if (dgv.Columns[e.ColumnIndex].Name.Equals("WorkplaceName") 
    { 
     // Use helper method to get the string from lookup table 
     e.Value = GetWorkplaceNameLookupValue(
      dataGridViewScanDetails.Rows[e.RowIndex].Cells["UserWorkplaceID"].Value); 
    } 
} 

如果你有很多可見的行,這可能會影響性能,但它可能是一個體面的方式來使它工作。

如果不能吸引你,或許使用DataTable.Merge()方法您的查找表合併到主表。快速瀏覽一下我的ADO.NET書籍,可以發現這應該起作用,儘管我還沒有嘗試過。但我不確定這是否與您之前建議的想法太接近,因此您擊落了。

至於你關於查找組合框的第二個問題,你應該把它發佈在一個單獨的問題中,以便它得到適當的關注。

+0

謝謝,我在考慮ComboBox和TextBox在他們的行爲/屬性上是相似的。我錯了。 – Wodzu 2010-07-26 06:38:51

1

您可以讓SQL來完成這項工作。使用連接返回一個包含Workplace名稱而不是ID的表格,將該表格輸出到數據集中並代之以使用它。

例如。

SELECT A.UserID, A.UserName, B.WorkplaceID 
    FROM Users A 
    JOIN Workplaces B ON A.UserWorkplaceID = B.WorkplaceID 

然後使用它的輸出來填充dsUsers。

+1

感謝您的想法,但我不想這樣做。我想要的就是我在我的問題中描述的內容。 – Wodzu 2010-07-25 19:02:47

3

在我看來,最好的決定是使用DataGridViewComboBoxColumn列類型。如果你這樣做,你應該創建查找數據事先然後設置數據源,DataPropertyName,DisplayMember和ValueMember的DataGridViewComboBoxColumn的性能數據適配器。您還可以將DisplayStyle屬性設置爲Nothing以使該列看起來像普通數據列。而已。

相關問題