如何判断DataGridView正在编辑的行为新行?

时间:2021-11-15 12:31:07
为DataGridView添加一个新行,此时该行的IsNewRow = True;
但是在为该行输入数据后(任意一个单元格输入数据),此时该行的IsNewRow=False;
我现在想知道在往数据库提交的时候,如何知道该行是新行还是旧行?也就是说是使用insert into或update,这点我非奇疑惑.
谢谢.

13 个解决方案

#1


DataRow里面可以判断它的行状态
DatRowState如果是added那就是新行

#2


你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可 

#3


你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可 

==============
在知道对象的时候可以通过主键来做,但做通用的东西用主键就不行了,因为我也不知道主键是什么,或者是多少主键,或者是主键的数据类型也是未知的.

#4


设置一下DATAKEY
通过编辑行的索引来引用主键,若为新行,主键一般为空

#5


感谢songhuan .你这种方式在直接使用数据填充是可行的,不过直接用List<T>对象,T没有相关的状态...
看来datagridview自己是解决不了这个问题...

#6


使用泛型以可以的,可以给类的属性加注释


[Column(Storage="_BlockID", DbType="Int NOT NULL", IsPrimaryKey=true)]
public int BlockID
{
get
{
return this._BlockID;
}
set
{
if ((this._BlockID != value))
{
this.OnBlockIDChanging(value);
this.SendPropertyChanging();
this._BlockID = value;
this.SendPropertyChanged("BlockID");
this.OnBlockIDChanged();
}
}
}

#7


   if (this.dataGridView1.NewRowIndex == this.dataGridView1.CurrentRow.Index)

#8




        [IsPrimaryKey=true)]
        public int BlockID
        {
            get
            {
                return this._BlockID;
            }
            set
            {
                this._BlockID != value
            }
        }

#9


引用楼主 CNLAN 的帖子:
为DataGridView添加一个新行,此时该行的IsNewRow = True; 
但是在为该行输入数据后(任意一个单元格输入数据),此时该行的IsNewRow=False; 
我现在想知道在往数据库提交的时候,如何知道该行是新行还是旧行?也就是说是使用insert into或update,这点我非奇疑惑. 
谢谢.

  对SQL语句加个判断,i=0时执行插入 i=1 执行跟新。

#10



这段代码仅供参考

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.Reflection;
public partial class _Default : System.Web.UI.Page 
{
    
    protected void Page_Load(object sender, EventArgs e)
    {

        Person myPerson=new Person();

        CommonService.SetPrimaryKeyValue<Person>(myPerson, 1);

        object k = CommonService.GetPrimaryKeyValue<Person>(myPerson);


    }


}


public static class CommonService
{
    public static PropertyInfo GetPrimaryKey<T>(T myClass)
    {
        PropertyInfo[] PropertyInfos = myClass.GetType().GetProperties();
        foreach (PropertyInfo myPropertyInfo in PropertyInfos)
        {
            DescriptionAttribute[] attributes = (DescriptionAttribute[])myPropertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attributes.Length != 0 && attributes[0].Description == "IsPrimaryKey=true")
            {
                return myPropertyInfo;
            }
        }

        return null;
    }





    public static void SetPrimaryKeyValue<T>(T myClass, object value)
    {
        PropertyInfo myPropertyInfo = GetPrimaryKey<T>(myClass);
        myPropertyInfo.SetValue(myClass, value,null);
    }



    public static object GetPrimaryKeyValue<T>(T myClass)
    {
        PropertyInfo myPropertyInfo = GetPrimaryKey<T>(myClass);
        return myPropertyInfo.GetValue(myClass,null);
    }
}


public class Person
{
    private int _ID;

    [Description("IsPrimaryKey=true")]
    public int ID
    {
        get
        {
            return this._ID;
        }
        set
        {
            _ID = value;
        }
    }



    private string  _name;

    
    public string name
    {
        get
        {
            return this._name;
        }
        set
        {
            _name = value;
        }
    }
}

#11


接分,嫌我回复短,我就加长一些,再加长一些!不服我就再加长,哼哼!

#12


引用 1 楼 zzyhuian06142 的回复:
DataRow里面可以判断它的行状态
DatRowState如果是added那就是新行

#13


引用 1 楼 zzyhuian06142 的回复:
DataRow里面可以判断它的行状态 
DatRowState如果是added那就是新行


nod

#1


DataRow里面可以判断它的行状态
DatRowState如果是added那就是新行

#2


你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可 

#3


你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可 

==============
在知道对象的时候可以通过主键来做,但做通用的东西用主键就不行了,因为我也不知道主键是什么,或者是多少主键,或者是主键的数据类型也是未知的.

#4


设置一下DATAKEY
通过编辑行的索引来引用主键,若为新行,主键一般为空

#5


感谢songhuan .你这种方式在直接使用数据填充是可行的,不过直接用List<T>对象,T没有相关的状态...
看来datagridview自己是解决不了这个问题...

#6


使用泛型以可以的,可以给类的属性加注释


[Column(Storage="_BlockID", DbType="Int NOT NULL", IsPrimaryKey=true)]
public int BlockID
{
get
{
return this._BlockID;
}
set
{
if ((this._BlockID != value))
{
this.OnBlockIDChanging(value);
this.SendPropertyChanging();
this._BlockID = value;
this.SendPropertyChanged("BlockID");
this.OnBlockIDChanged();
}
}
}

#7


   if (this.dataGridView1.NewRowIndex == this.dataGridView1.CurrentRow.Index)

#8




        [IsPrimaryKey=true)]
        public int BlockID
        {
            get
            {
                return this._BlockID;
            }
            set
            {
                this._BlockID != value
            }
        }

#9


引用楼主 CNLAN 的帖子:
为DataGridView添加一个新行,此时该行的IsNewRow = True; 
但是在为该行输入数据后(任意一个单元格输入数据),此时该行的IsNewRow=False; 
我现在想知道在往数据库提交的时候,如何知道该行是新行还是旧行?也就是说是使用insert into或update,这点我非奇疑惑. 
谢谢.

  对SQL语句加个判断,i=0时执行插入 i=1 执行跟新。

#10



这段代码仅供参考

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.Reflection;
public partial class _Default : System.Web.UI.Page 
{
    
    protected void Page_Load(object sender, EventArgs e)
    {

        Person myPerson=new Person();

        CommonService.SetPrimaryKeyValue<Person>(myPerson, 1);

        object k = CommonService.GetPrimaryKeyValue<Person>(myPerson);


    }


}


public static class CommonService
{
    public static PropertyInfo GetPrimaryKey<T>(T myClass)
    {
        PropertyInfo[] PropertyInfos = myClass.GetType().GetProperties();
        foreach (PropertyInfo myPropertyInfo in PropertyInfos)
        {
            DescriptionAttribute[] attributes = (DescriptionAttribute[])myPropertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attributes.Length != 0 && attributes[0].Description == "IsPrimaryKey=true")
            {
                return myPropertyInfo;
            }
        }

        return null;
    }





    public static void SetPrimaryKeyValue<T>(T myClass, object value)
    {
        PropertyInfo myPropertyInfo = GetPrimaryKey<T>(myClass);
        myPropertyInfo.SetValue(myClass, value,null);
    }



    public static object GetPrimaryKeyValue<T>(T myClass)
    {
        PropertyInfo myPropertyInfo = GetPrimaryKey<T>(myClass);
        return myPropertyInfo.GetValue(myClass,null);
    }
}


public class Person
{
    private int _ID;

    [Description("IsPrimaryKey=true")]
    public int ID
    {
        get
        {
            return this._ID;
        }
        set
        {
            _ID = value;
        }
    }



    private string  _name;

    
    public string name
    {
        get
        {
            return this._name;
        }
        set
        {
            _name = value;
        }
    }
}

#11


接分,嫌我回复短,我就加长一些,再加长一些!不服我就再加长,哼哼!

#12


引用 1 楼 zzyhuian06142 的回复:
DataRow里面可以判断它的行状态
DatRowState如果是added那就是新行

#13


引用 1 楼 zzyhuian06142 的回复:
DataRow里面可以判断它的行状态 
DatRowState如果是added那就是新行


nod