Silverlight 查询DataGrid 中匹配项 ,后台改变选中行颜色

来源:互联网 发布:java系统日志管理 编辑:程序博客网 时间:2024/05/19 15:40

需求:根据关键字(参会人号码或名称)查找参会人,在datagird 中高亮显示

界面:我在界面上增加了一个文本框和按钮,进行查找操作

操作说明:

根据关键字进行搜索:输入关键字 点击查找,如果找到 以蓝色背景显示整行数据(坑爹的项目经理非让用这个颜色,一点都不好看偷笑),找不到进行提示;继续点击查找 寻找下一个匹配项


上代码:

声明了三个变量,next 存储下一个匹配项,list 存储所有匹配项,color 为行背景色

 ConfMemberModel next = null;        List<ConfMemberModel> list = new List<ConfMemberModel>();        Color color = new Color() { A = 255, R = 43, G = 97, B = 237 };

搜索按钮事件代码,简单的进行了实现,还可以再优化下,达到更优效果大笑

private void btnSeach_Click(object sender, RoutedEventArgs e)        {            string txtPhoneno = txtSeach.Text.Trim();            if (txtPhoneno != "")            {                var collection = dataGrid1.ItemsSource as ObservableCollection<ConfMemberModel>;                                start: if (next == null)                    {                        next = collection.FirstOrDefault<ConfMemberModel>((cmm) =>                        {                            if (cmm.Phoneno.Contains(txtPhoneno) || cmm.Data.Contains(txtPhoneno))                            {                                dataGrid1.SelectedItem = cmm;                                dataGrid1.Columns.ToList().ForEach(                                        (dgc) =>                                        {                                            FrameworkElement fwElement = dgc.GetCellContent(cmm);                                            SetRowBG(fwElement, new SolidColorBrush(color));                                        }                                    );                                return true;                            }                            return false;                        });                        if (next != null)                        {                            list.Add(next);                        }                        else                        {                            var messageBox = new cwConfirmBox();                            messageBox.Show("未找到号码" + txtPhoneno);                            return;                        }                    }                    else                    {                        next = collection.FirstOrDefault<ConfMemberModel>((cmm) =>                        {                            if ((cmm.Phoneno.Contains(txtPhoneno) || cmm.Data.Contains(txtPhoneno)) && !list.Contains(cmm))                            {                                dataGrid1.SelectedItem = cmm;                                dataGrid1.Columns.ToList().ForEach(                                        (dgc) =>                                        {                                            FrameworkElement fwElement = dgc.GetCellContent(cmm);                                            SetRowBG(fwElement, new SolidColorBrush(color));                                        }                                    );                                return true;                            }                            else                            {                                dataGrid1.Columns.ToList().ForEach(                                        (dgc) =>                                        {                                            FrameworkElement fwElement = dgc.GetCellContent(cmm);                                            SetRowBG(fwElement, null);                                        }                                    );                            }                            return false;                        });                        if (next != null)                        {                            list.Add(next);                        }                        else                        {                            list.Clear();                            goto start;                        }                    }            }            else            {                var messageBox = new cwConfirmBox();                messageBox.Show("请输入号码!");                return;            }        }

/// <summary>        /// 设置行背景        /// </summary>        /// <param name="b"></param>        void SetRowBG(FrameworkElement fwElement, Brush brush)        {            DependencyObject dpObject = VisualTreeHelper.GetParent(fwElement);            if (dpObject.GetType() == typeof(Grid))            {                var grid = dpObject as Grid;                grid.Background = brush;                return;            }            else            {                SetRowBG(dpObject as FrameworkElement, brush);            }        }

原理很简单,就是把所有列的背景进行了改变,此方法对列较少的datagird还行,多了也没测试,不知道性能会有多大影响水平有限,暂时想到的这样操作,希望有大牛能够指点下。大笑

原创粉丝点击