[英]DataGridView column names from object property values?
public class Employee
{
public int ColumnName {set; get;}
public int RowOrder {set; get;}
public string TabName {set; get;}
public string Names {set; get;}
}
BindingList<Employee> workers = new BindingList<Employee>();
workers.Add(new Employee(1, 0, "Foo", "Bob Jones"));
workers.Add(new Employee(2, 0, "Foo", "Jane Jones"));
workers.Add(new Employee(3, 0, "Foo", "Jim Jones"));
workers.Add(new Employee(1, 1, "Foo", "Joe Jones"));
workers.Add(new Employee(3, 1, "Foo", "John Jones"));
workers.Add(new Employee(1, 0, "Bar", "Worker Bee1"));
workers.Add(new Employee(2, 0, "Bar", "Worker Bee2"));
我有一個帶有標簽條的winform。 可以動態添加選項卡,並且它們的名稱與TabName屬性相同。 每個選項卡都包含一個DataGridView,該名稱也與TabName屬性相同。
因此,每個選項卡/網格視圖應僅顯示來自正確對象的數據(foo選項卡僅顯示網格中的foo人,等等)。 我希望列名是每個對象(例如1,2,3)中ColumnName的值,並且我希望RowOrder是該名稱出現在其中的行號。所以我正在尋找看起來像的輸出如下所示:
1 2 3
==================================
Bob Jones Jane Jones Jim Jones
Joe Jones John Jones
如果網格坐標不包含值,則應將其留空。
對於Winforms編程,我相對較新-搜索給我留下了更多有關最佳方法的疑問。 我設置了與對象列表的通用數據綁定,但這給我留下了以每個屬性(ColumnName,RowOrder等)命名的列,並且我不會提及這不能解決我的每個tab / datagrid僅顯示該數據的問題。
linq表達式是將每個DataGridView放在一起的好方法嗎? 如果是這樣,我將如何制作一個將列名更改為ColumnName中的值的表達式? 我可以按RowOrder排序以使每行正確保留空白嗎?
如果我僅創建其他對象列表來填充每個選項卡/網格並手動進行排序/堆疊,我會更好嗎?
首先,您將需要重新組織數據結構。 名稱列表及其行號和列號無濟於事。 認為在選項卡包含表包含行包含名稱。
private void AddRow(DataTable dt, params string[] names)
{
// Expand columns as required
while (dt.Columns.Count < names.Length)
{
DataColumn col = dt.Columns.Add();
col.ColumnName = dt.Columns.Count.ToString();
}
// Add new row
DataRow row = dt.NewRow();
for (int i = 0; i < names.Length; i++)
row[i] = names[i];
dt.Rows.Add(row);
}
private void AddToColumn(DataTable dt, int rowIdx, int colIdx, string name)
{
while (dt.Columns.Count < colIdx)
{
DataColumn col = dt.Columns.Add();
col.ColumnName = dt.Columns.Count.ToString();
}
if (dt.Rows.Count > 0)
{
while (dt.Rows[0].ItemArray.Length < colIdx)
dt.Rows[0][dt.Rows[0].ItemArray.Length] = "";
}
DataRow row;
if (rowIdx < dt.Rows.Count)
{
row = dt.Rows[rowIdx];
row[colIdx - 1] = name;
}
else
{
row = dt.NewRow();
row[colIdx - 1] = name;
dt.Rows.Add(row);
}
}
private void buttonStart_Click(object sender, EventArgs e)
{
Dictionary<string, DataTable> workers = new Dictionary<string, DataTable>();
DataTable dt = new DataTable();
AddRow(dt, "Bob Jones", "Jane Jones", "Jim Jones");
AddRow(dt, "Joe Jones", "", "John Jones");
workers.Add("Foo", dt);
AddToColumn(dt, 0, 4, "Testing"); // Use this if you have to add by column
dt = new DataTable();
AddRow(dt, "Worker Bee1", "Worker Bee2");
workers.Add("Bar", dt);
string tabName = "Foo";
dataGridView1.DataSource = workers.FirstOrDefault(x => x.Key == tabName).Value;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.