![](/img/trans.png)
[英]WinForms DataGridView - databind to an object with a list property (variable number of columns)
[英]Databind Object to Winforms DatagridView with ComboBox
目前我正在嘗試將 object 屬性數據綁定到 datagridview。 問題是 datagridview 應該有一個 combobox 列,用戶必須在兩個值之間進行選擇。
有問題的 class 是這個:
public class SingleTableRow
{
/// <summary>
/// Input für datagrid
/// </summary>
public string PropertyName { get; set; }
public string VaultProperty { get; set; }
public string SageProperty { get; set; }
public bool IsSync { get; set; }
public bool AreSame { get; set; }
public bool IsSageLeading { get; set; }
/// <summary>
/// Single Table row constructor
/// </summary>
/// <param name="allValues"></param>
public SingleTableRow(List<string> allValues)
{
PropertyName = allValues[0];
VaultProperty = allValues[1];
SageProperty = allValues[2];
IsSync = false;
IsSageLeading = true;
AreSame = VaultProperty.Equals(SageProperty);
}
}
除 IsSync 之外的所有值都應綁定到 Datagridview。 IsSageLeading 是 Boolean 並指示應為用戶預選兩個值中的哪一個(Vault 或 Sage)。
一旦完成,它應該是這樣的:
我已經有了一個實現,但它只能通過為字符串值創建一個數據表然后在之后添加一個帶有組合框的列來工作。 這顯然是一個糟糕的設計,因為最后一列沒有排序並且不包含 object 的值。
dtgrid.DataSource = table;
.
.
.
DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
combo.HeaderText = "Führendes System";
combo.Name = "Führendes System";
String[] options = { "Vault", "Sage" };
combo.Items.AddRange(options);
dtgrid.Columns.Add(combo);
我如何最好地解決這個問題?
聽起來您需要將 IsSageLeading 中的 map 和Boolean
值IsSageLeading
為您要顯示的兩個值之一(Vault 或 Sage)。 正如您已經注意到的那樣,由於組合框列不是數據源的一部分,因此它獨立於 GRIDS 數據源運行。
下面的代碼應該允許您將IsSageLeading
屬性綁定到組合框列,這樣false
值將顯示為“Vault”, true
值將顯示為“Sage”。
我們需要關注組合框列的三個屬性……第一個是列DataPropertyName
。 這將指向 GRIDS 數據源中的列……即Boolean
IsSageLeading
屬性。
接下來,我們需要為組合框列創建一個數據源。 此數據源將是一個具有兩個字段和兩行的DataTable
。 稱為ValueMem
的第一個字段是Boolean
類型。 稱為DisplayMem
的第二個字段是一個string
字段。 整個表格可能如下所示……
值內存 | 顯示內存 |
---|---|
錯誤的 | 金庫 |
真的 | 智者 |
該表將用作組合框列的DataSource
。 我們需要為該列設置的屬性是ValueMember
和DisplayMember
,它們顯然將指向組合框數據源中的兩個字段中的每一個。
下面的代碼應使您能夠將Boolean
IsSageLeading
屬性綁定到組合框列。 唯一需要注意的是,您需要在設置 Grids DataSource 之前添加組合框列。
private void Form1_Load(object sender, EventArgs e) {
dataGridView1.Columns.Add(GetComboColumn());
dataGridView1.DataSource = GetGridData();
dataGridView1.Columns["Fuhrendes System"].DisplayIndex = 3;
}
private DataGridViewComboBoxColumn GetComboColumn() {
DataTable dt = new DataTable();
dt.Columns.Add("ValueMem", typeof(bool));
dt.Columns.Add("DisplayMem", typeof(string));
dt.Rows.Add(false, "Vault");
dt.Rows.Add(true, "Sage");
DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
col.HeaderText = "Fuhrendes System";
col.Name = "Fuhrendes System";
col.DataSource = dt;
col.DataPropertyName = "IsSageLeading";
col.ValueMember = "ValueMem";
col.DisplayMember = "DisplayMem";
return col;
}
private DataTable GetGridData() {
DataTable dt = new DataTable();
dt.Columns.Add("PropertyName", typeof(string));
dt.Columns.Add("VaultProperty", typeof(string));
dt.Columns.Add("SageProperty", typeof(string));
dt.Columns.Add("IsSync", typeof(bool));
dt.Columns.Add("AreSame", typeof(bool));
dt.Columns.Add("IsSageLeading", typeof(bool));
Random rand = new Random();
for (int i = 1; i < 10; i++) {
dt.Rows.Add("PropertyName " + i,
"VaultProperty " + i,
"SageProperty " + i,
rand.Next(2) == 1,
rand.Next(2) == 1,
rand.Next(2) == 1
);
}
return dt;
}
這應該允許組合框列充當網格數據源的一部分,而不是像前面描述的那樣分離……即,排序和過濾應該包括IsSageLeading
列。 我希望這是有道理的並有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.