但是在为该行输入数据后(任意一个单元格输入数据),此时该行的IsNewRow=False;
我现在想知道在往数据库提交的时候,如何知道该行是新行还是旧行?也就是说是使用insert into或update,这点我非奇疑惑.
谢谢.
13 个解决方案
#1
DataRow里面可以判断它的行状态
DatRowState如果是added那就是新行
DatRowState如果是added那就是新行
#2
你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可
#3
你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可
==============
在知道对象的时候可以通过主键来做,但做通用的东西用主键就不行了,因为我也不知道主键是什么,或者是多少主键,或者是主键的数据类型也是未知的.
==============
在知道对象的时候可以通过主键来做,但做通用的东西用主键就不行了,因为我也不知道主键是什么,或者是多少主键,或者是主键的数据类型也是未知的.
#4
设置一下DATAKEY
通过编辑行的索引来引用主键,若为新行,主键一般为空
通过编辑行的索引来引用主键,若为新行,主键一般为空
#5
感谢songhuan .你这种方式在直接使用数据填充是可行的,不过直接用List<T>对象,T没有相关的状态...
看来datagridview自己是解决不了这个问题...
看来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
对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
#13
nod
#1
DataRow里面可以判断它的行状态
DatRowState如果是added那就是新行
DatRowState如果是added那就是新行
#2
你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可
#3
你应该有主键吧?新增加的时候把主键设为一个不可能的值,更新的时候判断一下即可
==============
在知道对象的时候可以通过主键来做,但做通用的东西用主键就不行了,因为我也不知道主键是什么,或者是多少主键,或者是主键的数据类型也是未知的.
==============
在知道对象的时候可以通过主键来做,但做通用的东西用主键就不行了,因为我也不知道主键是什么,或者是多少主键,或者是主键的数据类型也是未知的.
#4
设置一下DATAKEY
通过编辑行的索引来引用主键,若为新行,主键一般为空
通过编辑行的索引来引用主键,若为新行,主键一般为空
#5
感谢songhuan .你这种方式在直接使用数据填充是可行的,不过直接用List<T>对象,T没有相关的状态...
看来datagridview自己是解决不了这个问题...
看来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
对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
#13
nod