星期一, 8月 18, 2014

[C#] DataGridView 的多選

論壇問題出處,把需求整理簡化為
DataGridView 多選,必須包含滑鼠單擊和滑鼠拖拉兩種選擇方式,該 Row 第一次被選擇背景顏色須改為灰色、該 Row 再次被選擇則變回白色
namespace MultiSelected
{
    public partial class MultiSelected : Form
    {
        public MultiSelected()
        {
            InitializeComponent();
        }

        private void MultiSelected_Load(object sender, EventArgs e)
        {
            // 建立 DataGridView 資料來源
            DataTable dt = new DataTable();

            dt.Columns.Add("ColEmpNO", typeof(int));
            dt.Columns.Add("ColEmpName", typeof(string));
            dt.Columns.Add("ColHireDate", typeof(DateTime));

            dt.Rows.Add(1, "趙一", new DateTime(1963, 7, 7));
            dt.Rows.Add(2, "洪二", new DateTime(1965, 5, 10));
            dt.Rows.Add(3, "張三", new DateTime(1981, 12, 11));
            dt.Rows.Add(4, "李四", new DateTime(1980, 1, 9));
            dt.Rows.Add(5, "王五", new DateTime(1973, 9, 9));

            if (dt.PrimaryKey.Length == 0) dt.Constraints.Add("PK", dt.Columns["colEmpNO"], true);
            dgvData.DataSource = dt;

            // DataGridView 設定
            // DataGridView.MultiSelect = true 才可以在 DataGridView 中全選,此為預設值
            dgvData.MultiSelect = true;
            // 設定 DataGridView 為全選整個 Row
            dgvData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        }

        private void dgvData_MouseUp(object sender, MouseEventArgs e)
        {
            // 使用者選取的 row,透過 DataGridView.SelectedRows 找出
            foreach (DataGridViewRow row in dgvData.SelectedRows)
            {
                // 利用 條件式等於 true ? 結果1 : 結果2 來顯示 row 背景顏色
                row.DefaultCellStyle.BackColor = row.DefaultCellStyle.BackColor == Color.DarkGray ? Color.White : Color.DarkGray;
            }

            // 取消使用者選擇的 Row,這樣較容易觀察到 row 背景顏色變化,不會被 Highlight 遮住
            // 下面兩種語法都可以達到該目的
            dgvData.CurrentCell = null;
            //dgvData.ClearSelection();
        }
    }
}
[C#] DataGridView 的多選

建議利用 CheckBox 讓使用者點選,會是一個比較簡單的 solution

沒有留言:

張貼留言