您的位置:首页 > 其它

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

2013-08-16 18:58 369 查看
需求:根据关键字(参会人号码或名称)查找参会人,在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还行,多了也没测试,不知道性能会有多大影响水平有限,暂时想到的这样操作,希望有大牛能够指点下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Silverlight datagrid