開發 Windows Form 使用 DataGrid DataSoruce 是一般陣列(Array) 只出現 Length及 使用 Dictionary 沒有顯示資料 的注意事項
本篇會介紹在開發 Windows Form 時,使用 List 或 陣列 給予 DataGrid 當做 DataSource 時,
只有出現 length 沒有出現資料的原因,以及使用Dictionary 沒有出現在DataGrid 的用法,提供兩種解決方式(Class 及 LINQ)。
在開發 Windows Form ,直接使用字串陣列,直接給 DataGrid 當 DataSource,在資料呈現方面,不會是想像中的資料,
程式碼如下:
string[] arrayOrders = new string[] { "訂單1", "訂單2", "訂單3", "訂單100" };
//這個只有出現 Length
dataGridView1.DataSource = arrayOrders;
畫面的呈現,不是顯示字串陣列的值,而是字串陣列值的長度。
原因是因為提供 DataGrid 的 DataSource 必須有實作提供屬性(Get,Set),而在範例當中的 string[] ,DataGrid的DataSource會去尋找這個陣列中,
提供的屬性名稱,而你可以透過程式碼看到,string[] 提供的是 Length ,所以回傳回去的是 Length 。
這個問題,可以透過以下兩個方式來處理。
1. 自行建立Class在透過List方式,將資料 Add 進去List,則可達到呈現正確的效果。
public class Orders
{
public Orders(string inOrderText)
{
orderText = inOrderText;
}
string orderText = String.Empty;
public string OrderText
{
set { orderText = value; }
get { return orderText; }
}
}
private void ArraySecondMethod()
{
List<Orders> listOrders = new List<Orders>();
foreach (string strValue in arrayOrders)
{
listOrders.Add(new Orders(strValue));
}
dataGridView1.DataSource = listOrders;
}
2. 在LINQ出現後,則可以透過 LINQ 查詢的方式,進行資料欄位的 SELECT (投影) ,則可以透過比較精簡的程式碼達成這個效果。
private void ArrayThirdMethod()
{
//使用LINQ Lammbda 給予屬性命名
dataGridView1.DataSource = arrayOrders.Select(y => new { 欄位名稱 = y }).ToList();
}
而 Windows Form 開發使用 Dictionary ,來給予 DataGrid 當 DataSource 沒有呈現出來。
Dictionary<string, string> dicOrders = new Dictionary<string, string>();
dicOrders.Add("1", "訂單1");
dicOrders.Add("2", "訂單2");
dicOrders.Add("3", "訂單3");
dataGridView1.DataSource = dicOrders;
這個問題,跟前面所提到的 string[] 陣列相同,而實作 Class 的部份,則不再特別提到,我們直接使用 LINQ 的方式來進行。
private void DictionarySecondMethod()
{
//使用LINQ Lammbda 給予屬性命名
dataGridView1.DataSource = dicOrders.Select(x => new { 欄位名稱1 = x.Key, 欄位名稱2 = x.Value }).ToList();
}
透過 LINQ 的 Lambda 方式,則使用精簡的程式碼達成這個效果。
結論:
這邊就分享在 Windows Form 入門開發的時候,對於 DataGrid DataSource 的使用,以及分享兩種不同的方式,來建立欄位的屬性給DataGrid呈現。
完整程式碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class DataGridForArray : Form
{
public DataGridForArray()
{
InitializeComponent();
}
Dictionary<string, string> dicOrders = new Dictionary<string, string>();
string[] arrayOrders = new string[] { "訂單1", "訂單2", "訂單3", "訂單100" };
private void DataGridForArray_Load(object sender, EventArgs e)
{
dicOrders.Add("1", "訂單1");
dicOrders.Add("2", "訂單2");
dicOrders.Add("3", "訂單3");
}
private void DictionaryFirstMethod()
{
dataGridView1.DataSource = dicOrders;
}
private void DictionarySecondMethod()
{
//使用LINQ Lammbda 給予屬性命名
dataGridView1.DataSource = dicOrders.Select(x => new { 欄位名稱1 = x.Key, 欄位名稱2 = x.Value }).ToList();
}
private void ArrayFirstMethod()
{
//這個只有出現 Length
dataGridView1.DataSource = arrayOrders;
}
private void ArraySecondMethod()
{
List<Orders> listOrders = new List<Orders>();
foreach (string strValue in arrayOrders)
{
listOrders.Add(new Orders(strValue));
}
dataGridView1.DataSource = listOrders;
}
private void ArrayThirdMethod()
{
//使用LINQ Lammbda 給予屬性命名
dataGridView1.DataSource = arrayOrders.Select(y => new { 欄位名稱 = y }).ToList();
}
private void btnGet_Click(object sender, EventArgs e)
{
switch (comboBox1.Text)
{
case "DictionaryFirstMethod":
DictionaryFirstMethod();
break;
case "DictionarySecondMethod":
DictionarySecondMethod();
break;
case "ArrayFirstMethod":
ArrayFirstMethod();
break;
case "ArraySecondMethod":
ArraySecondMethod();
break;
case "ArrayThirdMethod":
ArrayThirdMethod();
break;
}
//string[] customerNames = new string[] { "Jill", "Jack", "Johnny", "Jackson", "Jim" };
//List<string> arrCustomer = new List<string>();
//arrCustomer.Add("ggggg");
//arrCustomer.Add("dddddddddddddddd");
}
}
public class Orders
{
public Orders(string inOrderText)
{
orderText = inOrderText;
}
string orderText = String.Empty;
public string OrderText
{
set { orderText = value; }
get { return orderText; }
}
}
}
參考連結:
DataGridView.DataSource Property http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.datasource.aspx
How to bind a string list to a datagrid?