关于DataGridView的两个问题:先说下DataGridView使用的场景,我用实体类映射到数据表,使用一个BindingSource组件,这个BindingSource的数据源设置为IList<实体类>,然后DataGridView绑定到BindingSource上,设置DataGridView为自动添加新行,DataGridView的列为TextBoxColumn类型,有的列ReadOnly属性为False(可编辑),有的列为True(只读)。问题1:
正常情况下是光标进入新行的可编辑单元格,并且通过键盘编辑了单元格数据,此时才会自动添加下一个新行。现在我要实现的是双击新行的只读单元格,弹出对话框,对此单元格写入值,同时(调用某个函数?)添加下一个新行。也就是如何使双击新行的单元格与编辑单元格具有同样效果,也能触发自动添加新行的事件?问题2:
有的实体字段是int或decimal类型,默认构造函数里没有初始化这些字段,显示到DataGridView里就成了int的默认值0了,请问如何不显示默认的0(留空)?要如何设置呢,我想在实体类的默认构造函数里把int字段初始化成小的负数(如-10000,因为业务里用不到小负数),然后DataGridView添加新行时如果遇到-10000就当做Null,不显示,请问应该怎么设置DataGridView的格式呢?问题3:
我想按行保存DataGridView数据,即编辑完一行,离开时进行行验证,通过验证就保存数据到数据库,但我发现不论数据是否有变动,只要离开某行就会进行行验证,那么我的保存到数据库的代码就会被执行,这样频繁保存感觉效率不行,请问在行验证时如何知道DataGridView此行的值是否有变动呢?抑或保存到数据库的操作可以放到更合适的地方?不知道表达清楚了没哈,有点罗嗦了哈,时间紧急哈,还请各位大哥不吝赐教哈,分不够再开帖给哈~~

解决方案 »

  1.   

    具体的记不清了,只能提示一下,
    1 处理类似的CellDoubleClick,想怎么做就怎么做
    2 处理类似 RowItemBind之类的事件
    3 保存老的,跟新的比较。
      

  2.   

    3  做一个单独添加数据的,updatepanel包起来,验证什么的在这里写,添加完了在刷新gridview.比较好处理
      

  3.   

    问题1:
    正常情况下是光标进入新行的可编辑单元格,并且通过键盘编辑了单元格数据,此时才会自动添加下一个新行。现在我要实现的是双击新行的只读单元格,弹出对话框,对此单元格写入值,同时(调用某个函数?)添加下一个新行。也就是如何使双击新行的单元格与编辑单元格具有同样效果,也能触发自动添加新行的事件?这个问题其实就用事件来处理就可以了,例如cellclick或者是clickdown捕获相应的参数,判断逻辑就可以了,关于你说的添加一个新行也不是个问题,有相关的AddRow方法,但是要注意越界问题
    问题2:
    有的实体字段是int或decimal类型,默认构造函数里没有初始化这些字段,显示到DataGridView里就成了int的默认值0了,请问如何不显示默认的0(留空)?要如何设置呢,我想在实体类的默认构造函数里把int字段初始化成小的负数(如-10000,因为业务里用不到小负数),然后DataGridView添加新行时如果遇到-10000就当做Null,不显示,请问应该怎么设置DataGridView的格式呢?这个问题就是你在定义Model的时候,private int?xxx 这样就可以允许为空了,而且程序可以后期处理的问题3:
    我想按行保存DataGridView数据,即编辑完一行,离开时进行行验证,通过验证就保存数据到数据库,但我发现不论数据是否有变动,只要离开某行就会进行行验证,那么我的保存到数据库的代码就会被执行,这样频繁保存感觉效率不行,请问在行验证时如何知道DataGridView此行的值是否有变动呢?抑或保存到数据库的操作可以放到更合适的地方?
    这个和问题一是一样的,选择一个合适的事件,当触发的时候处理相关的逻辑,甚至自己可以写委托挂句柄定义需要的事件
      

  4.   

    -------------------
    1、我要的效果是双击后能自动添加新行,因为我的AllowUserToAddRows属性为true,要是调用AddNew()函数那就会出来两行了啊~~
    3、什么叫“选择一个合适的事件”?我请教的就是这个合适的事件是什么
      

  5.   

    问题1 建立一个新窗体,单独创建一个空的datagridview2,且只有一个空行,进行操作后在这一行添加到datagridview中
    问题2,datagridview绑定数据时如果字段为数值型,默认将null显示为0
    问题3,离开行时,检测这一行数据有没有变动,如果没有变动在行验证过程中使用e.cancel=true;
      

  6.   

    问题2可以用cellformating事件处理下
         /// <summary>
            /// datagridview数据格式化,
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            //private void DgvOverTime_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            //{
            //    string dateDiff = "超时:";
            //    if (e.ColumnIndex == 12)
            //    {
            //        DataGridViewRow row = this.DgvOverTime.Rows[e.RowIndex];
            //        if (row != null)
            //        {
            //            if (row.Cells["name"].Value!=null)
            //            {
    if(row.Cells["name"].Value.tostring()=="0"||row.Cells["name"].Value.tostring()=="-1000")
            //                e.value="";
            //            }
            //        }        //    }