C# WPF中DataGrid调用数据库的时候,发生下一条数据覆盖上一条数据,如下图两条if语句
展开全部
你是直接 DataGrid.ItemsSource = datatable.DefaultView;
这样就是每次指定一个数据源, 他肯定是覆盖掉原有记录的。
就好比
int a;
if(xxx)
a =1 ;
if(yyy)
a =2 ;
他肯定不会输出3的。
如果需要累加的显示所有历史记录,有两种办法,
1、使用ObservableCollection 即WPF提供的动态通知类集合。
如
先指定DataGrid.ItemsSource = Data;
private ObservableCollection<Model.MyData> _data= null;
public IList<Model.MyData> Data
{
get { return _data?? (_data= new ObservableCollection<Model.MyData>()); }
}
每次需要查询数据库的时候Data.Add(新纪录) ; 不要去重复进行数据源绑定。
2、数据库查询时累加,
DataTable dt = new DataTable();
if(xxx)
//把查询的结果加入dt
dt.Rows.Add( newrow);
if(yyy)
dt.Rows.Add(newrow);
每次添加完 要重新绑定:DataGrid.ItemsSource = dt.DefaultView;
第二种方法效率比较低。
这样就是每次指定一个数据源, 他肯定是覆盖掉原有记录的。
就好比
int a;
if(xxx)
a =1 ;
if(yyy)
a =2 ;
他肯定不会输出3的。
如果需要累加的显示所有历史记录,有两种办法,
1、使用ObservableCollection 即WPF提供的动态通知类集合。
如
先指定DataGrid.ItemsSource = Data;
private ObservableCollection<Model.MyData> _data= null;
public IList<Model.MyData> Data
{
get { return _data?? (_data= new ObservableCollection<Model.MyData>()); }
}
每次需要查询数据库的时候Data.Add(新纪录) ; 不要去重复进行数据源绑定。
2、数据库查询时累加,
DataTable dt = new DataTable();
if(xxx)
//把查询的结果加入dt
dt.Rows.Add( newrow);
if(yyy)
dt.Rows.Add(newrow);
每次添加完 要重新绑定:DataGrid.ItemsSource = dt.DefaultView;
第二种方法效率比较低。
追问
本人菜鸟,想知道第一种方法比较详细的应用
追答
前台DataGrid控件Name = "dg"
c#:
定义一个类
public class MyData
{
public int Id{set;get;}
public string Name{set;get;}
.....
//类里面定义你需要显示到界面上的字段,
}
界面后台代码
private ObservableCollection<Model.MyData> _data= null;public IList<Model.MyData> Data{get { return _data?? (_data= new ObservableCollection<Model.MyData>()); }}
void Update()
{
var dt = sqlHelper.ExcuteDataTable(....); //查数据库拿到需要添加的数据
foreach(DataRow row in dt.Rows)
{
Data.Add(new MyData()
{
Id = row["Id"]==DBNull.Value?0: Convert.ToInt32( row["Id"]);
Name = row["Name "]==DBNull.Value?0: Convert.ToInt32( row["Name ");
});
}
}
//不用重复去指定ItemsSource,前台界面会自动更新数据的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询