using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
public partial class OrderManageForm : Form
{
private BindingSource bindingSourceOrders = new BindingSource();
private bool isAddingNew = false; // 标记是否处于“新增”状态
public OrderManageForm()
{
InitializeComponent();
Load += OrderManageForm_Load;
}
private void OrderManageForm_Load(object sender, EventArgs e)
{
SetupData();
SetupUI();
LoadOrders();
}
private void SetupData()
{
// 绑定当前记录变化事件
bindingSourceOrders.CurrentChanged += BindingSource_CurrentChanged;
}
private void SetupUI()
{
// 绑定 BindingNavigator
bindingNavigator1.BindingSource = bindingSourceOrders;
// 设置 DataGridView
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = bindingSourceOrders;
dataGridView1.ReadOnly = true;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.AllowUserToAddRows = false;
// 拦截新增操作
bindingSourceOrders.AddingNew += BindingSource_AddingNew;
// 绑定文本框事件(假设 textBox2=订单原价,textBox3=会员ID)
textBox2.TextChanged += RecalculateAll; // 订单原价
textBox3.TextChanged += RecalculateAll; // 会员ID
}
private void LoadOrders()
{
string sql = "SELECT * FROM torder ORDER BY 收款时间 DESC";
DataTable dt = new DataTable();
try
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, clsDB.conn))
{
adapter.Fill(dt);
}
bindingSourceOrders.DataSource = dt;
if (bindingSourceOrders.Count > 0)
{
bindingSourceOrders.Position = 0;
UpdateFormFromCurrentRow();
}
else
{
ResetInputFields();
}
}
catch (Exception ex)
{
MessageBox.Show("加载订单失败:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
isAddingNew = true;
ResetInputFields(); // 清空表单准备录入
e.Cancel = true; // 不自动添加空行
}
private void BindingSource_CurrentChanged(object sender, EventArgs e)
{
if (!isAddingNew && bindingSourceOrders.Current != null)
{
UpdateFormFromCurrentRow();
}
}
private void UpdateFormFromCurrentRow()
{
if (bindingSourceOrders.Current is DataRowView rowView)
{
DataRow row = rowView.Row;
// 同步数据显示到控件(使用默认命名)
textBox1.Text = row["单据号"].ToString();
DateTime receiptTime = Convert.ToDateTime(row["收款时间"]);
label6.Text = string.Format("{0:yyyy-MM-dd HH:mm:ss}", receiptTime);
textBox2.Text = row["订单原价"].ToString();
textBox3.Text = row["会员ID"].ToString();
textBox4.Text = row["支付方式"].ToString();
textBox5.Text = row["找零"].ToString();
decimal finalAmount = Convert.ToDecimal(row["折后实收"]);
int pointsThis = Convert.ToInt32(row["本单积分"]);
int totalPoints = Convert.ToInt32(row["累计积分"]);
label7.Text = string.Format("折后实收:{0:F2}", finalAmount);
label8.Text = string.Format("本单积分:{0}", pointsThis);
label9.Text = string.Format("累计积分:{0}", totalPoints);
}
}
private void ResetInputFields()
{
textBox1.Clear(); // 单据号
label6.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
textBox2.Clear(); // 原价
textBox3.Clear(); // 会员ID
textBox4.Clear(); // 支付方式
textBox5.Clear(); // 找零
ClearCalculatedResults();
GenerateReceiptNo();
}
private void ClearCalculatedResults()
{
label7.Text = "折后实收:--";
label8.Text = "本单积分:--";
label9.Text = "累计积分:--";
}
private void GenerateReceiptNo()
{
string dateStr = DateTime.Now.ToString("yyyyMMdd");
string prefix = "D" + dateStr;
string sql = "SELECT MAX(单据号) FROM torder WHERE 单据号 LIKE ?";
try
{
using (OleDbCommand cmd = new OleDbCommand(sql, clsDB.conn))
{
cmd.Parameters.AddWithValue("@p1", prefix + "%");
if (clsDB.conn.State != ConnectionState.Open)
clsDB.conn.Open();
object result = cmd.ExecuteScalar();
int seq = 1;
if (result != null && result != DBNull.Value)
{
string lastNo = result.ToString();
if (lastNo.StartsWith(prefix))
{
string numPart = lastNo.Substring(prefix.Length);
if (int.TryParse(numPart, out int n))
seq = n + 1;
}
}
textBox1.Text = prefix + seq.ToString("D3");
}
}
catch
{
textBox1.Text = "D" + dateStr + "001"; // 失败时降级处理
}
}
private void RecalculateAll(object sender, EventArgs e)
{
ClearCalculatedResults();
if (!decimal.TryParse(textBox2.Text.Trim(), out decimal originalPrice) || originalPrice <= 0)
return;
decimal discount = IsToday8th() ? originalPrice * 0.12m : 0;
decimal coupon = originalPrice >= 50 ? 2 :
originalPrice >= 30 ? 1 : 0;
decimal finalAmount = Math.Max(0, originalPrice - discount - coupon);
int pointsThis = (int)finalAmount;
string memberId = string.IsNullOrEmpty(textBox3.Text.Trim()) ? "非会员" : textBox3.Text.Trim();
int totalPoints = memberId == "非会员" ? pointsThis : GetMemberTotalPoints(memberId, pointsThis);
label7.Text = string.Format("折后实收:{0:F2}", finalAmount);
label8.Text = string.Format("本单积分:{0}", pointsThis);
label9.Text = string.Format("累计积分:{0}", totalPoints);
}
private bool IsToday8th()
{
return DateTime.Now.Day == 8;
}
private int GetMemberTotalPoints(string memberId, int thisPoints)
{
string sql = "SELECT 可用积分 FROM tMember WHERE 会员ID = ?";
try
{
using (OleDbCommand cmd = new OleDbCommand(sql, clsDB.conn))
{
cmd.Parameters.AddWithValue("@p1", memberId);
object result = cmd.ExecuteScalar();
int existing = result != null ? Convert.ToInt32(result) : 0;
UpdateOrCreateMember(memberId, existing + thisPoints);
return existing + thisPoints;
}
}
catch
{
return thisPoints; // 出错按新用户处理
}
}
private void UpdateOrCreateMember(string memberId, int newPoints)
{
string checkSql = "SELECT COUNT(*) FROM tMember WHERE 会员ID = ?";
string updateSql = "UPDATE tMember SET 可用积分 = ? WHERE 会员ID = ?";
string insertSql = "INSERT INTO tMember (会员ID, 可用积分) VALUES (?, ?)";
try
{
using (OleDbCommand checkCmd = new OleDbCommand(checkSql, clsDB.conn))
{
checkCmd.Parameters.AddWithValue("@p1", memberId);
int count = (int)checkCmd.ExecuteScalar();
if (count > 0)
{
using (OleDbCommand cmd = new OleDbCommand(updateSql, clsDB.conn))
{
cmd.Parameters.AddWithValue("@p1", newPoints);
cmd.Parameters.AddWithValue("@p2", memberId);
cmd.ExecuteNonQuery();
}
}
else
{
using (OleDbCommand cmd = new OleDbCommand(insertSql, clsDB.conn))
{
cmd.Parameters.AddWithValue("@p1", memberId);
cmd.Parameters.AddWithValue("@p2", newPoints);
cmd.ExecuteNonQuery();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("更新会员信息失败:" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void button1_Click(object sender, EventArgs e) // 提交按钮
{
try
{
string receiptNo = textBox1.Text.Trim();
if (string.IsNullOrEmpty(receiptNo))
{
MessageBox.Show("⚠️ 单据号不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
string memberId = string.IsNullOrEmpty(textBox3.Text.Trim()) ? "非会员" : textBox3.Text.Trim();
DateTime receiptTime = DateTime.Now;
if (!decimal.TryParse(textBox2.Text, out decimal originalPrice) || originalPrice <= 0)
{
MessageBox.Show("请输入有效的订单原价!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (!label7.Text.Contains(":") || !decimal.TryParse(label7.Text.Split(':')[1], out decimal finalAmount))
{
MessageBox.Show("请先完成计算后再提交!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
decimal discount = IsToday8th() ? originalPrice * 0.12m : 0;
decimal coupon = originalPrice >= 50 ? 2 : (originalPrice >= 30 ? 1 : 0);
int pointsThis = int.Parse(label8.Text.Split(':')[1]);
int totalPoints = int.Parse(label9.Text.Split(':')[1]);
string payment = string.IsNullOrEmpty(textBox4.Text) ? "现金" : textBox4.Text.Trim();
decimal change = decimal.TryParse(textBox5.Text, out decimal c) ? c : 0;
if (IsReceiptExists(receiptNo))
{
MessageBox.Show("❌ 该单据号已存在,请勿重复提交!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
string sql = @"INSERT INTO torder
(单据号, 会员ID, 收款时间, 订单原价, 订单优惠, 消费券抵扣金额,
折后实收, 支付方式, 本单积分, 累计积分, 找零)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
using (OleDbCommand cmd = new OleDbCommand(sql, clsDB.conn))
{
cmd.Parameters.AddRange(new OleDbParameter[]
{
new OleDbParameter("@p1", receiptNo),
new OleDbParameter("@p2", memberId),
new OleDbParameter("@p3", receiptTime),
new OleDbParameter("@p4", originalPrice),
new OleDbParameter("@p5", discount),
new OleDbParameter("@p6", coupon),
new OleDbParameter("@p7", finalAmount),
new OleDbParameter("@p8", payment),
new OleDbParameter("@p9", pointsThis),
new OleDbParameter("@p10", totalPoints),
new OleDbParameter("@p11", change)
});
if (clsDB.conn.State != ConnectionState.Open)
clsDB.conn.Open();
cmd.ExecuteNonQuery();
}
MessageBox.Show(
string.Format("✅ 订单已保存!单据号:{0}", receiptNo),
"成功",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
LoadOrders();
bindingSourceOrders.Position = bindingSourceOrders.Count - 1;
isAddingNew = false;
}
catch (Exception ex)
{
MessageBox.Show("❌ 保存失败:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private bool IsReceiptExists(string receiptNo)
{
string sql = "SELECT COUNT(*) FROM torder WHERE 单据号 = ?";
try
{
using (OleDbCommand cmd = new OleDbCommand(sql, clsDB.conn))
{
cmd.Parameters.AddWithValue("@p1", receiptNo);
if (clsDB.conn.State != ConnectionState.Open)
clsDB.conn.Open();
return (int)cmd.ExecuteScalar() > 0;
}
}
catch
{
return false;
}
}
private void button2_Click(object sender, EventArgs e) // 刷新按钮
{
LoadOrders();
}
}
错误 32 未能找到类型或命名空间名称“AddingNewEventArgs”(是否缺少 using 指令或程序集引用?) D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 79 57 千依零食
错误 2 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 96 63 千依零食
错误 6 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 163 60 千依零食
错误 8 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 163 61 千依零食
错误 12 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 180 78 千依零食
错误 14 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 180 101 千依零食
错误 18 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 276 75 千依零食
错误 20 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 276 98 千依零食
错误 24 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 282 115 千依零食
错误 26 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 282 116 千依零食
错误 30 无效的表达式项“)” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 294 75 千依零食
错误 11 无效的表达式项“decimal” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 180 65 千依零食
错误 17 无效的表达式项“decimal” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 276 62 千依零食
错误 23 无效的表达式项“decimal” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 282 104 千依零食
错误 29 无效的表达式项“decimal” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 294 74 千依零食
错误 5 无效的表达式项“int” D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 163 59 千依零食
错误 1 应输入 ) D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 96 56 千依零食
错误 3 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 96 63 千依零食
错误 4 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 96 64 千依零食
错误 7 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 163 60 千依零食
错误 9 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 163 61 千依零食
错误 10 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 163 62 千依零食
错误 13 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 180 78 千依零食
错误 15 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 180 101 千依零食
错误 16 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 180 102 千依零食
错误 19 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 276 75 千依零食
错误 21 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 276 98 千依零食
错误 22 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 276 99 千依零食
错误 25 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 282 115 千依零食
错误 27 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 282 116 千依零食
错误 28 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 282 117 千依零食
错误 31 应输入 ; D:\Desktop\学习\C#\C#课设\千依零食\千依零食\OrderManageForm.cs 294 75 千依零食