我在DataGridView(dgvStock为DataGridView名)下创建了一下几列:
DataGridViewTextBoxColumn dtc = new DataGridViewTextBoxColumn();
            dtc.Name = "ISRC";
            dtc.HeaderText = "商品编号";
            dtc.Width = 150;
            dtc.SortMode = DataGridViewColumnSortMode.Automatic;
            dtc.ReadOnly = true;
            dgvStock.Columns.Add(dtc);            dtc = new DataGridViewTextBoxColumn();
            dtc.Name = "DishName";
            dtc.HeaderText = "商品全名";
            dtc.Width = 150;
            dtc.SortMode = DataGridViewColumnSortMode.Automatic;
            dtc.ReadOnly = true;
            dgvStock.Columns.Add(dtc);            dtc = new DataGridViewTextBoxColumn();
            dtc.Name = "Amount";
            dtc.HeaderText = "数量";
            dtc.Width = 80;
            dtc.SortMode = DataGridViewColumnSortMode.Automatic;            
            dgvStock.Columns.Add(dtc);            dtc = new DataGridViewTextBoxColumn();
            dtc.Name = "Cost";
            dtc.HeaderText = "单价";
            dtc.Width = 100;
            dtc.SortMode = DataGridViewColumnSortMode.Automatic;
            dtc.DefaultCellStyle.Format = "C2";
            dgvStock.Columns.Add(dtc);            dtc = new DataGridViewTextBoxColumn();
            dtc.Name = "Sum";
            dtc.HeaderText = "金额";
            dtc.Width = 100;
            dtc.SortMode = DataGridViewColumnSortMode.Automatic;
            dtc.DefaultCellStyle.Format = "C2";
            dtc.ReadOnly = true;             
            dgvStock.Columns.Add(dtc);            dtc = new DataGridViewTextBoxColumn();
            dtc.Name = "Re";
            dtc.HeaderText = "备注";
            dtc.Width = 100;
            dtc.SortMode = DataGridViewColumnSortMode.Automatic;
            dgvStock.Columns.Add(dtc);
我要如何设置Amount列只能输入数字和回退键?Cost列只能输入数字和小数点和回退键?如何使Sum列自动生成总金额?还有当我连续输入了多行数据的,我怎么把输入的数据保存到数据库?请教大虾帮忙!

解决方案 »

  1.   

    这个好像不难,我以前做过类似的
    你可以用dataGridView的一个事件
    我先给你顶顶,后给你查查
      

  2.   

    需要自己写个DataGridViewColumn
    重写DataGridViewCell如:
    代码较多,详见MSDN
      

  3.   

    在CellValueChanged事件中,根据e.rowIndex和e.columnIndex判断所在行列,如果
    新单元格值含有不想要的字符,就将数据重置(从数据源或设一全局变量)。
    总金额,自己算好了。
    DatagridView可以自动更新数据源,若数据源是datatable或dataTable的dataview的话,可以用sqldataAdapter.Update(datatable)更新到数据库,这样最简单。
      

  4.   


    public DataGridViewTextBoxEditingControl cellEdit = null;        private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                cellEdit = (DataGridViewTextBoxEditingControl)e.Control;
                cellEdit.SelectAll();
                cellEdit.KeyPress += new KeyPressEventHandler(dataGridView1_KeyPress); 
            }        private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (dataGridView1.CurrentCellAddress.X == 0)
                {
                     if ((Convert.ToInt32(e.KeyChar) < 48 || Convert.ToInt32(e.KeyChar) > 57) && Convert.ToInt32(e.KeyChar) != 46 && Convert.ToInt32(e.KeyChar) != 8 && Convert.ToInt32(e.KeyChar) != 13)
                    {
                        e.Handled = true;  // 输入非法就屏蔽
                    }
                    else
                    {
                        if (Convert.ToInt32(e.KeyChar) == 46)
                        {
                            e.Handled = true;
                        }
                    }            }
            }
    刚试验成功的。
      

  5.   

    上面的代码只针对Amount列有效,而且你要把dataGridView1.CurrentCellAddress.X == 0改成你列的索引号(应该为:2)。
    Cost列你可以自己查查对应的ASCII码值,把dataGridView1.CurrentCellAddress.X == 0改成你列的索引号。
    if ((Convert.ToInt32(e.KeyChar) < 48 ....这样的值改成相应的ASCII码值,就可以了Sum列自动统计更简单了,你可以用dataGridView的单元格失去焦点事件来完成,找准数量和单价的索引号,取出他们对应的值(行和列),就可以完成Sum列了还有当我连续输入了多行数据的,我怎么把输入的数据保存到数据库:
    这个应该有单击按钮来完成把,不可能,你在DataGridView中刚输入一条数据,一失去焦点数据就插到数据库里面了。
    DataGridView和数据库绑定,你是用向导完成的还是自己写的代码,向导完成的绑定,实现起来比较容易些,自己写的代码实现起来麻烦些。
      

  6.   

    我感觉你的KeyPree这样是不是更简便呢?
    void cellEdit_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (dgvStock.CurrentCellAddress.X == 2)
                {
                    e.Handled = e.KeyChar < '0' || e.KeyChar > '9';//允许输入数字
                    if (e.KeyChar == (char)8)//允许输入回退键
                        e.Handled = false;                
                }
            }
    ,但是还是先感激你的方法,不然我也实现不了这一步,因为我还是刚刚开始学的,先在这里谢过toploveall大虾的帮忙
    还有,我创建的这个DataGridView是用作进货单的,我的数据库字段有StockId(单号),ISRC(产品编号,外键),PublishersId(进货商编号,外键),DepotId(仓库编号,外键),InDate(进货时间),Amount(进货数量),Cost(进货价),我如果有多条信息怎么可以把他们全部取出来插入数据库进货表呢?仓库和进货商是通过下拉框选择的,进货时间就是当前时间,单号是自动生成的到文本框的,请指教,我现在都有点做傻了。
      

  7.   

    感谢toploveall大虾的帮忙,我已经解决了问题了,谢谢!