開發 Windows Form 使用 DataGrid DataSoruce 是一般陣列(Array) 只出現 Length及 使用 Dictionary 沒有顯示資料 的注意事項

開發 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;

 

畫面的呈現,不是顯示字串陣列的值,而是字串陣列值的長度。


 

image

原因是因為提供 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;

        }

image

2. 在LINQ出現後,則可以透過 LINQ 查詢的方式,進行資料欄位的 SELECT (投影) ,則可以透過比較精簡的程式碼達成這個效果。

 

private void ArrayThirdMethod()
        {
            //使用LINQ Lammbda 給予屬性命名
            dataGridView1.DataSource = arrayOrders.Select(y => new { 欄位名稱 = y }).ToList();
        }

 

image

 


而 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;

image

 

這個問題,跟前面所提到的 string[] 陣列相同,而實作 Class 的部份,則不再特別提到,我們直接使用 LINQ 的方式來進行。

 

 

private void DictionarySecondMethod()
        {
            //使用LINQ Lammbda 給予屬性命名
            dataGridView1.DataSource = dicOrders.Select(x => new { 欄位名稱1 = x.Key, 欄位名稱2 = x.Value }).ToList();

        }

image

 

透過 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?