實作「重新整理」按鈕
聲明全域變數來追蹤修改過的資料
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;
}
}
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,尤其在銀行、保險、政府等領域。理解這項技術有助於維護現有系統並順利過渡到新技術。