Search this site
Embedded Files
學習護照WebService
  • 首頁
  • 第一節
    • 第一步
    • 第二步
  • 第二節
    • 第三步
    • 第四步
  • 參考資料
學習護照WebService
  • 首頁
  • 第一節
    • 第一步
    • 第二步
  • 第二節
    • 第三步
    • 第四步
  • 參考資料
  • More
    • 首頁
    • 第一節
      • 第一步
      • 第二步
    • 第二節
      • 第三步
      • 第四步
    • 參考資料

第四步

實作資料查詢功能 

  • 實作「重新整理」按鈕

  • 聲明全域變數來追蹤修改過的資料 

private DataTable productsTable; 

private bool isDataDirty = false; 

添加事件處理程序

  • 雙擊「重新整理」按鈕

  • 添加事件處理程序 

private void button1_Click(object sender, EventArgs e)

{

    // 如果資料已修改但未儲存,提示使用者

    if (isDataDirty)

    {

        DialogResult result = MessageBox.Show(

            "您有未儲存的變更。繼續重新整理將丟失這些變更。確定要繼續嗎?",

            "未儲存的變更",

            MessageBoxButtons.YesNo,

            MessageBoxIcon.Warning);


        if (result == DialogResult.No)

        {

            return;

        }

    }


    LoadProductData();

}

添加事件處理程序

  • LoadProductData方法來獲取和顯示資料

private void LoadProductData()

{

    try

    {

        // 更新狀態

        Cursor = Cursors.WaitCursor;


        // 建立WebService客戶端

        ProductService.HelloWorldService service = new ProductService.HelloWorldService();


        // 呼叫GetAllProducts方法獲取產品資料

        DataSet productsDataSet = service.GetAllProducts();


        // 檢查是否成功獲取資料

        if (productsDataSet != null && productsDataSet.Tables.Count > 0)

        {

            // 獲取第一個資料表

            productsTable = productsDataSet.Tables[0];


            // 清除DataGridView現有資料

            dataGridView1.DataSource = null;


            // 綁定資料到DataGridView

            dataGridView1.DataSource = productsTable;


            // 格式化資料列

            FormatDataGridView();


            // 重置修改標記

            isDataDirty = false;

        }

        else

        {

            MessageBox.Show("未能獲取產品資料。服務返回空資料集。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);

        }

    }

    catch (Exception ex)

    {

        MessageBox.Show($"資料加載錯誤:{ex.Message}", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    finally

    {

        Cursor = Cursors.Default;

    }

}

FormatDataGridView方法來格式化顯示

private void FormatDataGridView()

{

    // 確保DataGridView已繫結資料

    if (dataGridView1.DataSource == null) return;


    // 設定欄位標題和顯示格式

    dataGridView1.Columns["ProductID"].HeaderText = "產品ID";

    dataGridView1.Columns["ProductID"].ReadOnly = true;  // ID不可編輯

    dataGridView1.Columns["ProductID"].Width = 70;


    dataGridView1.Columns["ProductName"].HeaderText = "產品名稱";

    dataGridView1.Columns["ProductName"].Width = 150;


    dataGridView1.Columns["Price"].HeaderText = "價格";

    dataGridView1.Columns["Price"].DefaultCellStyle.Format = "N2";  // 顯示兩位小數

    dataGridView1.Columns["Price"].Width = 80;


    dataGridView1.Columns["Stock"].HeaderText = "庫存";

    dataGridView1.Columns["Stock"].Width = 70;


    dataGridView1.Columns["Description"].HeaderText = "產品描述";

    dataGridView1.Columns["Description"].Width = 200;


    dataGridView1.Columns["LastUpdated"].HeaderText = "最後更新時間";

    dataGridView1.Columns["LastUpdated"].ReadOnly = true;  // 更新時間不可編輯

    dataGridView1.Columns["LastUpdated"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";  // 格式化日期

    dataGridView1.Columns["LastUpdated"].Width = 150;


    // 設定交替行背景色以提高可讀性

    dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;


    // 自動調整最後一列寬度以填滿剩餘空間

    dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

}

在表單載入時自動加載資料

雙擊視窗

private void Form1_Load(object sender, EventArgs e)

{

    LoadProductData();

}

資料更新事件處理

  • 監聽DataGridView的資料變更事件

  • 在事件 尋找「CellValueChanged」,雙擊

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)

{

    if (e.RowIndex >= 0 && e.ColumnIndex >= 0)

    {

        // 標記資料已被修改

        isDataDirty = true;

    }

}

實作「儲存變更」按鈕功能

  • 尋找「儲存變更」按鈕,雙擊

private void button2_Click(object sender, EventArgs e)

{

    if (!isDataDirty)

    {

        MessageBox.Show("資料沒有變更,無需儲存。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

        return;

    }

    SaveChanges();

}

private void SaveChanges()

{

    try

    {

        // 更新狀態

        Cursor = Cursors.WaitCursor;


        // 建立WebService客戶端

        ProductService.HelloWorldService service = new ProductService.HelloWorldService();


        // 計數成功更新的行數

        int successCount = 0;


        // 逐行處理修改過的資料

        foreach (DataRow row in productsTable.Rows)

        {

            // 只處理已修改的行

            if (row.RowState == DataRowState.Modified)

            {

                int productId = Convert.ToInt32(row["ProductID"]);

                string productName = row["ProductName"].ToString();

                decimal price = Convert.ToDecimal(row["Price"]);

                int stock = Convert.ToInt32(row["Stock"]);

                string description = row["Description"].ToString();


                // 呼叫WebService的UpdateProduct方法

                bool updateSuccess = service.UpdateProduct(productId, productName, price, stock, description);


                if (updateSuccess)

                {

                    successCount++;

                }

                else

                {

                    MessageBox.Show($"更新產品 {productId} 失敗!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                }

            }

        }


        // 更新完成後重新加載資料

        if (successCount > 0)

        {

            MessageBox.Show($"成功更新 {successCount} 筆產品資料。", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);


            // 重新載入資料以獲取最新的資料庫狀態

            LoadProductData();

        }

        else

        {

            MessageBox.Show("沒有資料被更新。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

    }

    catch (Exception ex)

    {

        MessageBox.Show($"儲存變更時發生錯誤:{ex.Message}", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    finally

    {

        Cursor = Cursors.Default;

    }

}

!!課程結束!!

雖然現代開發趨向RESTful API,但許多企業環境仍廣泛使用SOAP WebService,尤其在銀行、保險、政府等領域。理解這項技術有助於維護現有系統並順利過渡到新技術。

Google Sites
Report abuse
Page details
Page updated
Google Sites
Report abuse