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還行,多了也沒測試,不知道性能會有多大影響水平有限,暫時想到的這樣操作,希望有大牛能夠指點下。大笑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章