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

需求:根据关键字(参会人号码或名称)查找参会人,在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还行,多了也没测试,不知道性能会有多大影响水平有限,暂时想到的这样操作,希望有大牛能够指点下。大笑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章