如何让代码在Datagrid重新绑定itemsource并加载完毕之后执行?

yusend 2013-08-30 02:00:41
是WPF的程序 DataGrid控件
这是要执行的函数

public static void ConvertRow()
{
TenantsListWindow TLW = (TenantsListWindow)TL;
for (int i = 0; i < TLW.tenantsDg.Items.Count; i++)
{
Quartecost quarte = TLW.tenantsDg.Items[i] as Quartecost;
string state = quarte.State.Trim();
if (state == "已交")
{
var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow;
row.Background = new SolidColorBrush(Colors.DarkSeaGreen);
}
else
{
var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow;
row.Background = new SolidColorBrush(Colors.IndianRed);
}
}
}


在我选择状态点确定之后重新指向了ItemsSource,返回的是过滤后的List集合

private void jiaofeiquedingBut_Click(object sender, RoutedEventArgs e)
{
ComboBoxItem cbi = (ComboBoxItem)jiaofeizhuangtaiCb.SelectedItem;
string item;
if (cbi != null)
{
item = (string)cbi.Tag;

tenantsDg.ItemsSource = QuartecostDAL.GetAllCommunity(item, community);

update = true;
//我如果在这里执行ConvertRow函数的话,那么ConvertRow函数中变量row就是null;
}
else
MessageBox.Show("请选择一个状态", "提示", MessageBoxButton.OK, MessageBoxImage.Error);
}


有没有什么事件是在数据加载完毕之后才发生的?
...全文
397 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Allyiyan 2014-09-10
  • 打赏
  • 举报
回复
楼主应该贴重绘的代码吧 你贴错了
yusend 2013-09-04
  • 打赏
  • 举报
回复

            DataGridRow row = e.Row;
            Quartecost quartecost = (Quartecost)row.DataContext;
            
            if(quartecost.State.Trim() == "已交")
                row.Background = new SolidColorBrush(Colors.DarkSeaGreen);
            else
                row.Background = new SolidColorBrush(Colors.IndianRed);
            //放在DataGrid的LoadingRow事件里
我把答案贴出来吧,免得又有新手跟我一样,就这几行代码找了将近一礼拜.
yusend 2013-09-04
  • 打赏
  • 举报
回复
引用 22 楼 jshi123 的回复:
DataGrid是Lazy的,它只在需要显示的时候才会去创建在显示区域范围内DataGridRow。 如果想让DataGrid在设置ItemSource会生成全部的DataGridRow,要这样: dataGrid.ItemsSource = DAL.GetAll(); if (!Window.GetWindow(dataGrid).IsVisible) Window.GetWindow(dataGrid).Show(); dataGrid.UpdateLayout(); foreach (var item in dataGrid.Items) dataGrid.ScrollIntoView(item); 然后就可以调用dataGrid.ItemContainerGenerator.ContainerFromItem(item);取到DataGridRow。 上面这种做法是不可取的,因为要一次性生成全部的DataGridRow,性能会有很大影响。 正确的做法是监听DataGridRow的加载事件,当row创建的时候再去对它进行处理: dataGrid.LoadingRow += dataGrid_LoadingRow; void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e) { e.Row.Background = 。。。 }
哥啊...这么多人,总算您给说到点子上去了!!
jshi123 2013-08-31
  • 打赏
  • 举报
回复 2
DataGrid是Lazy的,它只在需要显示的时候才会去创建在显示区域范围内DataGridRow。 如果想让DataGrid在设置ItemSource会生成全部的DataGridRow,要这样: dataGrid.ItemsSource = DAL.GetAll(); if (!Window.GetWindow(dataGrid).IsVisible) Window.GetWindow(dataGrid).Show(); dataGrid.UpdateLayout(); foreach (var item in dataGrid.Items) dataGrid.ScrollIntoView(item); 然后就可以调用dataGrid.ItemContainerGenerator.ContainerFromItem(item);取到DataGridRow。 上面这种做法是不可取的,因为要一次性生成全部的DataGridRow,性能会有很大影响。 正确的做法是监听DataGridRow的加载事件,当row创建的时候再去对它进行处理: dataGrid.LoadingRow += dataGrid_LoadingRow; void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e) { e.Row.Background = 。。。 }
yusend 2013-08-31
  • 打赏
  • 举报
回复
引用 17 楼 rui_china 的回复:
[quote=引用 15 楼 yusend 的回复:] 上面图发错了
那有问题?我没看出来问题在那?[/quote] 你看我在var row之前加了一个MessageBox.show()方法,之后就有值了,否则row就是null的... 这到底是什么问题.... 能不能帮我远程看下? 我QQ 3029913
yusend 2013-08-31
  • 打赏
  • 举报
回复
引用 18 楼 rui_china 的回复:
if (vd1[i].state == "已交")
{
(TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow).Background = new SolidColorBrush(Colors.DarkSeaGreen);
}


结果还是一样的
yusend 2013-08-31
  • 打赏
  • 举报
回复
引用 17 楼 rui_china 的回复:
[quote=引用 15 楼 yusend 的回复:] 上面图发错了
那有问题?我没看出来问题在那?[/quote] 我加了个MessageBox.show就好了.不加就是空
yusend 2013-08-30
  • 打赏
  • 举报
回复
引用 1 楼 rui_china 的回复:
public static void ConvertRow() { TenantsListWindow TLW = (TenantsListWindow)TL; List<Quartecost> vd1 = TLW.tenantsDg.ItemsSource as List<Quartecost>; for (int i = 0; i < vd1.Count; i++) { //Quartecost quarte = TLW.tenantsDg.Items[i] as Quartecost; //string state = quarte.State.Trim(); if (vd1[i].state == "已交") { var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow; row.Background = new SolidColorBrush(Colors.DarkSeaGreen); } else { var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow; row.Background = new SolidColorBrush(Colors.IndianRed); } } }
我把它放在窗口的loaded事件中不行,我把它放在Datagrid的loaded事件中也不行
yusend 2013-08-30
  • 打赏
  • 举报
回复
引用 1 楼 rui_china 的回复:
public static void ConvertRow() { TenantsListWindow TLW = (TenantsListWindow)TL; List<Quartecost> vd1 = TLW.tenantsDg.ItemsSource as List<Quartecost>; for (int i = 0; i < vd1.Count; i++) { //Quartecost quarte = TLW.tenantsDg.Items[i] as Quartecost; //string state = quarte.State.Trim(); if (vd1[i].state == "已交") { var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow; row.Background = new SolidColorBrush(Colors.DarkSeaGreen); } else { var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow; row.Background = new SolidColorBrush(Colors.IndianRed); } } }
这个我应该放到什么事件里呢?
灬浪子灬 2013-08-30
  • 打赏
  • 举报
回复
if (vd1[i].state == "已交") { (TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow).Background = new SolidColorBrush(Colors.DarkSeaGreen); }
灬浪子灬 2013-08-30
  • 打赏
  • 举报
回复
引用 15 楼 yusend 的回复:
上面图发错了
那有问题?我没看出来问题在那?
灬浪子灬 2013-08-30
  • 打赏
  • 举报
回复
public static void ConvertRow() { TenantsListWindow TLW = (TenantsListWindow)TL; List<Quartecost> vd1 = TLW.tenantsDg.ItemsSource as List<Quartecost>; for (int i = 0; i < vd1.Count; i++) { //Quartecost quarte = TLW.tenantsDg.Items[i] as Quartecost; //string state = quarte.State.Trim(); if (vd1[i].state == "已交") { var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow; row.Background = new SolidColorBrush(Colors.DarkSeaGreen); } else { var row = TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow; row.Background = new SolidColorBrush(Colors.IndianRed); } } }
yusend 2013-08-30
  • 打赏
  • 举报
回复
谁能告诉我该怎么办呀..
yusend 2013-08-30
  • 打赏
  • 举报
回复
上面图发错了
yusend 2013-08-30
  • 打赏
  • 举报
回复
引用 13 楼 rui_china 的回复:
GetAllCommunity 获取不到数据row当然就为空了
问题应该是在GetAllCommunity这个方法上
加一个处理
if (cbi != null)
{
item = (string)cbi.Tag;

tenantsDg.ItemsSource = QuartecostDAL.GetAllCommunity(item, community);
if(( TLW.tenantsDg.ItemsSource as List<Quartecost>).count>0)
{
执行ConvertRow函数的
}
}


还是一样

row是空的

而且有个很诡异的解决方法



这样就能解决.....
我Q 3029913 能否帮忙看下?
灬浪子灬 2013-08-30
  • 打赏
  • 举报
回复
GetAllCommunity 获取不到数据row当然就为空了 问题应该是在GetAllCommunity这个方法上 加一个处理 if (cbi != null) { item = (string)cbi.Tag; tenantsDg.ItemsSource = QuartecostDAL.GetAllCommunity(item, community); if(( TLW.tenantsDg.ItemsSource as List<Quartecost>).count>0) { 执行ConvertRow函数的 } }
yusend 2013-08-30
  • 打赏
  • 举报
回复
就是获取不到row对象啊 我晕死
yusend 2013-08-30
  • 打赏
  • 举报
回复
但ConvertRowEdit(就是你给我那个)里面的Row是空的
yusend 2013-08-30
  • 打赏
  • 举报
回复
有值哦



public static List<Quartecost> GetAllCommunity(string filter,string community)
{
string sql = "select * from T_Quartecost", name;
bool state;
DataTable table = CommunityManagerSystemTools.ExecuteDataTable(sql);
List<Quartecost> quartecostlist = new List<Quartecost>();
for (int i = 0; i < table.Rows.Count; i++)
{
DataRow row = table.Rows[i];
Quartecost quartecost = new Quartecost();
quartecost.Id = (long)row["ID"];
quartecost.Tid = (long)row["TID"];
quartecost.Name = (string)row["Name"];
name = quartecost.Name.Trim();

quartecost.Type = (string)row["Type"];
quartecost.Waterdosage = Convert.ToDecimal(row["Waterdosage"]);
quartecost.Watercost = Convert.ToDecimal(row["Watercost"]);
quartecost.Electricitydosage = Convert.ToDecimal(row["Electricitydosage"]);
quartecost.Electricitycost = Convert.ToDecimal(row["Electricitycost"]);
quartecost.Healthcost = Convert.ToDecimal(row["Healthcost"]);
quartecost.Elevatorcost = Convert.ToDecimal(row["Elevatorcost"]);
quartecost.Heatingcost = Convert.ToDecimal(row["Heatingcost"]);
quartecost.Total = Convert.ToDecimal(row["Total"]);

Tenants tenants = TenantsDAL.GetByName(name);
if (tenants.Community.Trim() == community)
{
state = Convert.ToBoolean(row["State"]);
if (state == false)
{
quartecost.State = "未交";
}
else
quartecost.State = "已交";

quartecost.Time = (string)row["Time"];
quartecost.IsDel = Convert.ToBoolean(row["IsDel"]);
quartecost.IsInput = Convert.ToBoolean(row["IsInput"]);

if (quartecost.IsDel == false)
{
if (filter != null)
{
if (quartecost.Type.Trim() == CommunityManagerSystemTools.ConvertDbType(filter))
quartecostlist.Add(quartecost);
else if (quartecost.State == filter)
quartecostlist.Add(quartecost);
}
else
{
quartecostlist.Add(quartecost);
}
}
}
}
return quartecostlist;
}


这是GetAllCommunity方法的代码
灬浪子灬 2013-08-30
  • 打赏
  • 举报
回复
QuartecostDAL.GetAllCommunity(item,community)获取数据为空不执行方法 我测试一切正常 断点看下是不是那没那到数据 row 有没有拿到
加载更多回复(5)

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧