[C#] DataGridView 應用(三) – 修改資料、條件設定

上一篇[C#] DATAGRIDVIEW 應用(二) – 右鍵選單、新增資料
介紹了使用右鍵選單來新增資料的方法
下一步我們將定義一些修改條件
並加入修改資料的功能


下圖是目前資料表的內容
這次的範例我所要設定的條件為

  1. 只能修改ContactName
  2. 輸入不超過30個字

2016-5-11 下午 05-02-36

先實作 1. 只能修改ContactName
這邊要使用DataGridView的CellBeginEdit事件來做Column的驗證

string textBeforeEdit;
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    if (e.ColumnIndex == 2) //只允許修改第3個Column(ContactName)
    {
        //儲存編輯前的文字,可以用來復原編輯前的狀態
        //若Value為null,則會設為空字串
        textBeforeEdit = (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value ?? "").ToString();
        return;
    }
    else
    {
        MessageBox.Show("僅開放修改ContactName");
        e.Cancel = true; //讓使用者無法繼續進行修改
    } 
}

接著看看效果如何
嘗試點擊第三欄的格子進行修改
如下圖,可以進行文字內容的編輯
2016-5-11 下午 05-29-58
再來點點看其他欄位的格子
就會跳出MessageBox,且無法進行文字編輯
2016-5-11 下午 05-30-33.png


接著實作 2.輸入不超過30個字
使用DataGridView的CellEndEdit事件來做文字內容的驗證

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    //取得編輯中的格子內容,若Value為null,則設為空字串
    string text = (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value ?? "").ToString();
    if (text.Length > 30)
    {
        MessageBox.Show("輸入不可超過30字");
        //復原編輯前狀態
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = textBeforeEdit;
    }
    else
    {
        //下一步要在這裡實作資料修改的方法
    }
}

測試一下,輸入超過30個字
2016-5-11 下午 05-40-00
跳出提示視窗
2016-5-11 下午 05-40-08
然後復原為編輯前的狀態
2016-5-11 下午 05-40-15


最後使用Entity Framework進行資料修改
方法都跟之前介紹的差不多

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    //取得編輯中的格子內容,若Value為null,則設為空字串
    string text = (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value ?? "").ToString();
    if (text.Length > 30)
    {
        MessageBox.Show("輸入不可超過30字");
        //復原編輯前狀態
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = textBeforeEdit;
    }
    else
    {
        try
        {
            //取得第一格的CustomerID
            string customerID = (dataGridView1.Rows[e.RowIndex].Cells[0].Value ?? "").ToString();
            //從資料庫根據ID取得目標Customer
            Customers cus = ef.Customers.Where(x => x.CustomerID == customerID).First();
            cus.ContactName = text;
            ef.SaveChanges();
            MessageBox.Show("修改成功");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            //修改失敗,復原編輯前狀態
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = textBeforeEdit;
        }
    }
}

進行修改測試
2016-5-11 下午 05-50-48
跳出修改成功的訊息
2016-5-11 下午 05-51-08
最後進SQL Server確認一下
2016-5-11 下午 05-51-39
確認修改成功!


下一篇:[C#] DataGridView 應用(四) – DataGridViewCell

[C#] DataGridView 應用(二) – 右鍵選單、新增資料

上一篇[C#] DataGridView 應用(一) – Column & DataRow
介紹了讀取資料並新增至DataGridView的方法
下一步我們將新增右鍵選單
並加入新增資料的功能


首先打造右鍵選單的框架
宣告ContextMenu,新增MenuItem,加入Click Event

private ContextMenu menu = new ContextMenu();

public frm_Main()
{
    InitializeComponent();

    //於Form建構時,加入以下程式碼
    MenuItem miAdd = new MenuItem("新增");//宣告新的按鈕項目
    miAdd.Click += new System.EventHandler(this.miAdd_Click);//連接Click事件
    menu.MenuItems.Add(miAdd);//新增到右鍵選單menu中

    menu.MenuItems.Add(new MenuItem("取消"));                 
}

private void miAdd_Click(object sender, System.EventArgs e)
{
    //之後要寫入新增資料的功能      
}

然後再設定DataGridView的MouseDown事件
確認是按下右鍵後,顯示選單

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)//按下右鍵
    {
        menu.Show(dataGridView1, new Point(e.X, e.Y));//顯示右鍵選單
    }
}

試試看,在DataGridView上面按右鍵
可以看到選單出現了
2016-5-10 下午 05-03-44


再來補上新增按鈕的事件內容
這邊我設計一個彈出視窗
2016-5-10 下午 05-23-58

public partial class frmAddData : Form
{
    NorthwindEntities ef;

    public frmAddData(NorthwindEntities ef)
    {
        InitializeComponent();
        this.ef = ef;
    }

    private void btnOK_Click(object sender, EventArgs e)
    {
        try
        {
            Customers customer = new Customers();
            customer.CustomerID = textBoxID.Text;
            customer.CompanyName = textBoxName.Text;

            ef.Customers.Add(customer);
            ef.SaveChanges();
            MessageBox.Show("新增成功");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());//顯示錯誤訊息
        }

        this.Close();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

然後回到前面的右鍵選單→新增
讓它的Click事件補上彈出視窗
並於視窗關閉後,重新讀取資料

private void miAdd_Click(object sender, System.EventArgs e)
{
    //右鍵新增
    frmAddData frm = new frmAddData(ef);
    frm.ShowDialog();//彈出對話視窗(新增資料)
            
    btnGetData.PerformClick();//重新讀取資料(刷新)
}

最後實際測試看看,如下圖結果
(右鍵選單→新增→輸入資料→按下OK)

2016-5-10 下午 05-21-53

2016-5-10 下午 05-22-18.png

大功告成!!

下一篇介紹修改資料設定條件的方法
[C#] DataGridView 應用(三) – 修改資料、條件設定

[C#] DataGridView 應用(一) – Column & DataRow

此系列文將介紹DataGridView的應用方法
不使用DataTable的BindingSource
而配合Entity Framework
彈性地實作資料的讀取、新增、修改、刪除等功能


首先是我們的目標資料表
和之前Entity Framework的介紹一樣
使用Northwind資料庫
資料表請參考如下圖

2016-5-9 下午 05-20-50


第一步很簡單
建立一個乾淨的DataGridView
2016-5-9 下午 06-01-41

然後我們手動新增以上資料表的欄位
當然,你也可以自行改寫出自動產生的方法

private void btnSetColumns_Click(object sender, EventArgs e)
{
    dataGridView1.Columns.Clear(); //清除所有Column
    AddColumn("CustomerID");
    AddColumn("CompanyName");
    AddColumn("ContactName");
    AddColumn("ContactTitle");
    AddColumn("Address");
    AddColumn("City");
    dataGridView1.AutoResizeColumns(); //調整寬度
}

public void AddColumn( string strHeader)
{
    DataGridViewColumn column = new DataGridViewTextBoxColumn();
    column.HeaderText = strHeader;
    dataGridView1.Columns.Add(column);
}

完成後如下圖
建立出我們需要的Columns
2016-5-9 下午 06-12-06
再來從資料庫讀取資料
並填入DataGridView中

private void btnGetData_Click(object sender, EventArgs e)
{
    dataGridView1.RowHeadersVisible = false; //隱藏RowHeader
    dataGridView1.Rows.Clear();
    List<Customers> lstCustomers = ef.Customers.ToList();
    foreach (Customers customer in lstCustomers)
    {
        List<object> lstObj = new List<object>();
        lstObj.Add(customer.CustomerID);
        lstObj.Add(customer.CompanyName);
        lstObj.Add(customer.ContactName);
        lstObj.Add(customer.ContactTitle);
        lstObj.Add(customer.Address);
        lstObj.Add(customer.City);

        dataGridView1.Rows.Add(lstObj.ToArray());//將Object Array填入DataRow
    }

    dataGridView1.AutoResizeColumns(); //自動調整寬度
}

完成結果如下圖
記得可以將DataGridView的Anchor設為Top, Bottom, Left, Right
旁邊按鈕則設定為Top, Right
控制項就能隨著視窗大小做縮放囉!
2016-5-9 下午 06-19-55.png

下一篇介紹右鍵選單及新增資料的方法
[C#] DATAGRIDVIEW 實作(二) – 右鍵選單、新增資料