在LightSwitch 2010中更改行/单元格颜色

时间:2015-07-23 11:01:22

标签: c# grid conditional-statements visual-studio-lightswitch

如果我有一个页面显示酒店列表(行数从1到500)。我想将行颜色更改为红色。 例如,第一行有5列:

Name      Age      Email      Tel      Salary      Gender_Man

Mo        25       xxx@x.com  12546    10          Yes

操作:如果Gender_Man == True,则将行颜色更改为红色。

由于我是C#的新手,请告诉我在灯开关中我可以在哪里以及如何做到这一点?

enter image description here

2 个答案:

答案 0 :(得分:1)

我已经在VB.NET中完成了这个。但是,我的解决方案改编自herehere,其中包含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列) ,以及找到要着色的目标列的单元格。