如果我有一个页面显示酒店列表(行数从1到500)。我想将行颜色更改为红色。 例如,第一行有5列:
Name Age Email Tel Salary Gender_Man
Mo 25 xxx@x.com 12546 10 Yes
操作:如果Gender_Man == True
,则将行颜色更改为红色。
由于我是C#的新手,请告诉我在灯开关中我可以在哪里以及如何做到这一点?
答案 0 :(得分:1)
我已经在VB.NET中完成了这个。但是,我的解决方案改编自here和here,其中包含C#中的示例,但是示例类的一些链接已被破坏。
基本上,您需要创建一个方法,将转换器类在加载时绑定到每一行。该绑定将采用特定的列名称,对于您来说它将是Gender_Man
。在上面的链接中,他们使用列Status
并且只能使用列名绑定。我的专栏名称为Color
,我必须使用New Binding("Details.Entity.Color")
,因此您可能需要使用此代码。
转换器类是IValueConverter
的一个非常简单的子类,必须实现一个可以留空的构造函数Convert
,它会测试列的值并返回一个SolidColorBrush
对象使用您想要背景的ARGB值,以及只引发异常的ConvertBack
。
另外,只是一个快速的批评,现在有更多的性别,而不仅仅是男性和女性,所以使用布尔来捕获这些信息可能会导致头痛。最好使用字符串,并可能做出正确验证的选择列表。
答案 1 :(得分:0)
这是我针对此问题提出的解决方案,它是LS 2015的更通用解决方案。
鉴于:我有一个名为MySpecialConfigurationGrid的数据网格
给出:MySpecialConfigurationGrid的基础EF类型是MySpecialConfiguration
给出:我要着色并用作颜色信息来源的列单元格称为MyColor
给出:此代码进入LSML的代码中。
void proxy_ControlAvailable(object sender, ControlAvailableEventArgs e)
{
var ctrl = (DataGrid)e.Control;
ctrl.LoadingRow += new EventHandler<DataGridRowEventArgs>(Ctrl_LoadingRow);
}
private void Ctrl_LoadingRow(object sender, DataGridRowEventArgs e)
{
//Getting a particular cell is tricky,
// you have cross reference the row instance in the particular
// column you want to find, and then get that thing's parent,
// which happens to be the DataGridCell you can control the rendering of.
DataGrid grid = (DataGrid)sender;
DataGridRow row = new DataGridRow();
row = e.Row;
var cell = (grid.Columns.First(item => item.SortMemberPath == nameof(MySpecialConfiguration.MyColor))
.GetCellContent(row) as Microsoft.LightSwitch.Presentation.Framework.ContentItemPresenter)
.Parent as DataGridCell;
Binding bgbinding = new Binding(nameof(MySpecialConfiguration.MyColor))
{
Mode = BindingMode.TwoWay,
Converter = new RowColorConverter(),
ValidatesOnExceptions = true
};
cell.SetBinding(DataGridCell.BackgroundProperty, bgbinding);
}
partial void MySpecialConfiguration_InitializeDataWorkspace(global::System.Collections.Generic.List<global::Microsoft.LightSwitch.IDataService> saveChangesTo)
{
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() =>
{
var proxy = this.FindControl(nameof(MySpecialConfigurationGrid));
proxy.ControlAvailable += new EventHandler<ControlAvailableEventArgs>(proxy_ControlAvailable);
});
}
public class RowColorConverter : IValueConverter
{
public RowColorConverter() { }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
var match = Regex.Match(value as string, "#(?<R>[a-fA-F0-9]{2})(?<G>[a-fA-F0-9]{2})(?<B>[a-fA-F0-9]{2})");
if (match.Success)
{
return new System.Windows.Media.SolidColorBrush(Color.FromArgb(255,
sToB(match.Groups["R"].Value),
sToB(match.Groups["G"].Value),
sToB(match.Groups["B"].Value)));
}
}
return new System.Windows.Media.SolidColorBrush(Color.FromArgb(0, 255, 255, 255));
}
private byte sToB(string s)
{
return byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
基本上,它的工作方式是将事件附加到行的创建中,然后绑定到行的加载事件中。从那里,您可以访问数据网格本身及其可视化树。做一些技巧以获得对DataGridCell的引用,然后将带有IValueConverter的Binding添加到其Background依赖项属性。 IValueConverter将HTML十六进制颜色三元组字符串解析为组成部分,并从中返回SolidColorBrush。
对于特定的Gender_Man = true,请调整ValueConverter以接受适当的值,然后更改代码其他位中的nameof()调用以引用适当的绑定列(绑定附加到color列) ,以及找到要着色的目标列的单元格。