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;
}
}
原理很简单,就是把所有列的背景进行了改变,此方法对列较少的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 中匹配项 ,后台改变选中行颜色
- WPF DataGrid ListView 等等 改变 选中行 颜色;以及 不变的原因
- silverlight datagrid 改变颜色
- 点击DataGrid的行选中checkbox并改变行的颜色
- WPF DataGrid 选中行颜色不改变问题
- silverLight: 修改Datagrid选中行的字体颜色
- wpf datagrid的行选中颜色无法改变 解决方法
- DataGrid中选中checkbox时,该行颜色改变(转)
- datagrid每一行都会随着鼠标的动作改变颜色
- easyui中根据后台数据动态改变datagrid的列
- LigerUI 设置选中行颜色改变与设置水平滚动条不显示
- Android改变ListView选中行字体颜色
- 在DataGrid(WinForm)中改变符合指定条件的行颜色的方法
- android 自定义 radiobutton 文字颜色随选中状态而改变
- 利用CSS3的特性改变文本选中时的颜色
- DataGrid 行改变颜色
- android上改变listView的选中颜色
- ASP.NET中怎样在DataGrid中选中一行后将选中行换一个颜色(转)
- 改变DataGrid单元格颜色
- iOS中改变选中视图的颜色等,将上次选中的视图变为默认