解决方案 »

  1.   

            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);
                    }
                }
            }
      

  2.   


    我把它放在窗口的loaded事件中不行,我把它放在Datagrid的loaded事件中也不行
      

  3.   


    我把它放在窗口的loaded事件中不行,我把它放在Datagrid的loaded事件中也不行
    我把它放在窗口的loaded事件中不行,我把它放在Datagrid的loaded事件中也不行
    就放在原来的位置
      

  4.   


    我把它放在窗口的loaded事件中不行,我把它放在Datagrid的loaded事件中也不行
    我把它放在窗口的loaded事件中不行,我把它放在Datagrid的loaded事件中也不行
    就放在原来的位置放在窗口的ContentRendered里没用啊?如果放在这里的话我选择类型点确定之后就不执行了
      

  5.   

    我是想在选择类型之后点确定然后把过滤过的集合重新绑定到ItemSource,然后等他加载完执行那个函数
      

  6.   


    还是一样..
    调用代码是这样的        private void leixingquedingBut_Click(object sender, RoutedEventArgs e)
            {
                ComboBoxItem cbi = (ComboBoxItem)leixingshaixuanCb.SelectedItem;
                string item;
                if (cbi != null)
                {
                    item = (string)cbi.Tag;                tenantsDg.ItemsSource = QuartecostDAL.GetAllCommunity(item,community);
                    CommunityManagerSystemTools.ConvertRowEdit();
                    //update = true;
                }
                else
                    MessageBox.Show("请选择一个类型","提示",MessageBoxButton.OK,MessageBoxImage.Error);
            }
      

  7.   

    QuartecostDAL.GetAllCommunity(item,community)获取数据为空不执行方法
    我测试一切正常  断点看下是不是那没那到数据
    row  有没有拿到
      

  8.   

    有值哦         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方法的代码
      

  9.   

    但ConvertRowEdit(就是你给我那个)里面的Row是空的
      

  10.   

    就是获取不到row对象啊 我晕死
      

  11.   

    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函数的
    }
                }
      

  12.   


    还是一样row是空的而且有个很诡异的解决方法这样就能解决.....
    我Q 3029913 能否帮忙看下?
      

  13.   

        if (vd1[i].state == "已交")
                    {
                        (TLW.tenantsDg.ItemContainerGenerator.ContainerFromItem(quarte) as DataGridRow).Background = new SolidColorBrush(Colors.DarkSeaGreen);
                    }
      

  14.   

    那有问题?我没看出来问题在那?我加了个MessageBox.show就好了.不加就是空
      

  15.   

    那有问题?我没看出来问题在那?你看我在var row之前加了一个MessageBox.show()方法,之后就有值了,否则row就是null的...
    这到底是什么问题....
    能不能帮我远程看下? 我QQ 3029913
      

  16.   

    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 = 
    }
      

  17.   


                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事件里我把答案贴出来吧,免得又有新手跟我一样,就这几行代码找了将近一礼拜.