You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何在运行时修改DataGridView中的商品价格?

解决DataGridView运行时无法修改价格的问题

看起来你遇到的是DataGridView单元格编辑权限或者数据源配置的问题,我帮你拆解几个常见的原因和解决办法:

第一步:检查DataGridView的基础编辑配置

首先确认界面控件的基础设置没问题:

  • 打开窗体设计器,选中DataGridView,在属性面板里把ReadOnly设为false(默认是false,但可能不小心被修改了)
  • 找到价格对应的列,把它的ReadOnly属性也设为false——这是很多人容易忽略的点,单独列的只读权限会覆盖控件的全局设置
  • 把EditMode属性改成EditOnEnter或者EditOnKeystrokeOrF2,这样点击或选中单元格就能直接编辑,不用额外操作

第二步:确保数据源是可编辑的

如果你的DataGridView绑定的是从数据库查询来的DataTable,有些情况会导致数据源只读:

  • 如果你是用DataReader直接填充DataTable,或者查询的是没有主键的视图,DataTable会默认无法编辑。解决办法是给DataTable设置主键:
    public void enterToGrid() {
        try {
            receipt obj = new receipt();
            DataTable dt = obj.GetItemData(itemNo.Text, quantity.Text); // 假设这是你获取数据的方法
            
            // 给DataTable设置主键(比如用商品编号列)
            if (dt.PrimaryKey.Length == 0) {
                dt.PrimaryKey = new DataColumn[] { dt.Columns["itemNo"] };
            }
            
            dataGridView1.DataSource = dt;
            
            // 手动开启价格列的编辑权限
            if (dataGridView1.Columns.Contains("price")) {
                dataGridView1.Columns["price"].ReadOnly = false;
            }
        } catch (Exception ex) {
            MessageBox.Show($"加载数据出错:{ex.Message}");
        }
    }
    
  • 如果你用的是强类型数据集,要确保对应的DataTable没有被标记为只读。

第三步:把修改后的价格同步到数据库(如果需要)

如果你的需求是修改界面价格后更新到数据库,还需要添加单元格编辑完成的事件处理:

  1. 在窗体设计器里给DataGridView绑定CellEndEdit事件
  2. 实现事件逻辑,把修改后的值提交到数据库:
    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
        // 只处理价格列的修改
        if (dataGridView1.Columns[e.ColumnIndex].Name != "price") return;
        
        DataGridViewRow editedRow = dataGridView1.Rows[e.RowIndex];
        string targetItemNo = editedRow.Cells["itemNo"].Value.ToString();
        decimal newPrice = Convert.ToDecimal(editedRow.Cells["price"].Value);
        
        // 调用你的receipt类来更新数据库
        receipt updateObj = new receipt();
        bool isUpdated = updateObj.UpdateItemPrice(targetItemNo, newPrice);
        
        if (!isUpdated) {
            MessageBox.Show("价格更新到数据库失败,请检查!");
            // 失败的话恢复原来的价格
            editedRow.Cells["price"].Value = updateObj.GetItemOriginalPrice(targetItemNo);
        }
    }
    
  3. 记得在receipt类里实现UpdateItemPrice方法,用参数化SQL避免注入:
    public bool UpdateItemPrice(string itemNo, decimal newPrice) {
        using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) {
            string sql = "UPDATE items SET price = @NewPrice WHERE itemNo = @ItemNo";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddWithValue("@NewPrice", newPrice);
            cmd.Parameters.AddWithValue("@ItemNo", itemNo);
            
            conn.Open();
            int rowsAffected = cmd.ExecuteNonQuery();
            return rowsAffected > 0;
        }
    }
    

最后提醒

如果只是想在界面临时修改价格(不需要同步数据库),只要完成前两步的配置就够了。如果是同步数据库的场景,一定要用参数化SQL,别直接拼接字符串,避免安全问题。

内容的提问来源于stack exchange,提问作者Anser Butt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:40:18