需求:根據關鍵字(參會人號碼或名稱)查找參會人,在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還行,多了也沒測試,不知道性能會有多大影響,水平有限,暫時想到的這樣操作,希望有大牛能夠指點下。