如何使用Border()仅显示网格(而不是列)的行边框

时间:2014-05-26 12:08:06

标签: c# .net silverlight border silverlight-5.0

我在silverlight应用程序中使用c#。

我有一个包含1行和3列的网格。 有两件事我不知道该怎么做:

(1)我必须显示just row(不是列,只有行)的边界。怎么做?

目前我有这样的网格:

//The p in function call below is yhe object obtained on deserialixing xml.
     private  static Grid GenerateGrid(Parameters p) 
            {
                Grid myGrid = new Grid();
                myGrid.Width = 650;       
                myGrid.HorizontalAlignment = HorizontalAlignment.Left;
                myGrid.VerticalAlignment = VerticalAlignment.Top;
                myGrid.ShowGridLines = false;

                ColumnDefinition colDef1 = new ColumnDefinition();
                ColumnDefinition colDef2 = new ColumnDefinition();
                ColumnDefinition colDef3 = new ColumnDefinition();
                myGrid.ColumnDefinitions.Add(colDef1);
                myGrid.ColumnDefinitions.Add(colDef2);
                myGrid.ColumnDefinitions.Add(colDef3);

                int totalRows = p.Parameter.Count() + p.Separator.Count();

                for (int i = 0; i < totalRows; i++)
                {
                    myGrid.RowDefinitions.Add(new RowDefinition());
                }               
                return (myGrid);
            } 

调用此功能是:

 XmlParameterClasses.Parameters parameter = 
     (XmlParameterClasses.Parameters)deserializer.Deserialize(reader);
 Grid BigGrid = GenerateGrid(parameter); 

我尝试实现的目的是:(我使用Border执行此操作,请参阅函数末尾)

        private static Grid GenerateComboBox(ViewModel.XmlParameterClasses.Parameter param, int LoopCount, Grid g) 
        { //param is the object of the class Parameter
            StackPanel sp1 = new StackPanel(); //These three stackpanels are inside the grid cell
            StackPanel sp2 = new StackPanel();
            StackPanel sp3 = new StackPanel();
            ComboBox cb = new ComboBox();
            TextBlock txtblk1 = new TextBlock();
            TextBlock txtblkLabel = new TextBlock();

            ////////////////////////////////////          

            //Label Display
            txtblkLabel.Text = param.Label;
            txtblkLabel.VerticalAlignment = System.Windows.VerticalAlignment.Center;
            txtblkLabel.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
            txtblkLabel.TextAlignment = System.Windows.TextAlignment.Center;
            txtblkLabel.FontWeight = FontWeights.Bold;
            txtblkLabel.FontSize = 15;
            txtblkLabel.FontStyle = FontStyles.Normal;
            txtblkLabel.Padding = new Thickness(5, 10, 5, 10);

            sp1.Orientation = Orientation.Horizontal;
            sp1.Children.Add(txtblkLabel);
            sp1.Width = 100;
            sp1.Height = 50;
            Grid.SetRow(sp1, LoopCount);
            Grid.SetColumn(sp1, 0);
            g.Children.Add(sp1);

            foreach(var item in param.Component.Attributes.Items) {
                cb.Items.Add(item);
            }
            cb.SelectionChanged += new SelectionChangedEventHandler(comboBox1_SelectionChanged);
            cb.SelectedIndex = cb.Items.Count - 1;



            //For text Display
            txtblk1.Text = cb.SelectedValue.ToString() + " millions";
            txtblk1.VerticalAlignment = System.Windows.VerticalAlignment.Center;
            txtblk1.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
            txtblk1.TextAlignment = System.Windows.TextAlignment.Center;
            txtblk1.FontWeight = FontWeights.Bold;
            txtblk1.FontSize = 15;
            txtblk1.FontStyle = FontStyles.Normal;
            txtblk1.Padding = new Thickness(5, 10, 5, 10);

            sp2.Orientation = Orientation.Horizontal;
            sp2.Children.Add(txtblk1);
            Grid.SetColumn(sp2, 2);
            Grid.SetRow(sp2, LoopCount);
            g.Children.Add(sp2);


            //For combo box display
            cb.Width = 45;
            cb.Height = 25;
            sp3.Orientation = Orientation.Horizontal;
            sp3.Children.Add(cb);
            sp3.Width = 50;
            sp3.Height = 50;

            Grid.SetColumn(sp3, 1);
            Grid.SetRow(sp3, LoopCount);
            g.Children.Add(sp3);


 ////////////Here is the Border Display ////////////////////////////
            Border rect = new Border();
            rect.Width = g.Width;
            rect.Height = g.Height;
            rect.BorderThickness = new Thickness(5);
            rect.BorderBrush = new SolidColorBrush(Colors.Black);
            g.Children.Add(rect);
////////////////////////////////////////////////////////////////////
            return (g);
        }

但获得的输出是这样的:(它只覆盖第一个单元格的边框而不是该行中的另外两个边框,而我只想在一行上有一个边框(不在该行的列上,只是行边界) ) enter image description here 有人可以帮助我实现这一步吗? 是否有可能实现我想要做的事情?

注意:请注意,代码必须仅使用c#实现,而不是使用xaml。

2 个答案:

答案 0 :(得分:1)

我通过创建1列和行的网格(而不是3 * 3单元格,它必须是1 * 3(行*列))来完成它。然后在每行中创建边框,然后再创建包含1行和3列的网格,然后创建此小网格的边框。

代码是:

            Border rect = new Border();
            rect.Width = g.Width;
            rect.Height = g.Height;
            rect.BorderThickness = new Thickness(2);
            rect.BorderBrush = new SolidColorBrush(Colors.Black);        

            Grid childGrid = new Grid();
            ColumnDefinition colDef1 = new ColumnDefinition();
            ColumnDefinition colDef2 = new ColumnDefinition();
            ColumnDefinition colDef3 = new ColumnDefinition();
            childGrid.ColumnDefinitions.Add(colDef1);
            childGrid.ColumnDefinitions.Add(colDef2);
            childGrid.ColumnDefinitions.Add(colDef3);
            TextBlock txtblk3 = new TextBlock();
            var border = new Border()
            {
                Background = new SolidColorBrush(Colors.LightGray)
            };
            border.Height = 14;

            var border1 = new Border()
            {
                Background = new SolidColorBrush(Colors.White)
            };
            border1.Height = 14;

            Grid.SetColumnSpan(border, 3);
            Grid.SetRow(childGrid, LoopCount);
            childGrid.Children.Add(border);

            txtblk3.FontSize = 14;
            txtblk3.FontWeight = FontWeights.Bold;

            txtblk3.Text = param.Separator[SeparatorPosition];
            Grid.SetColumn(border1, 1);
            Grid.SetRow(border1,LoopCount);
            border1.Child = txtblk3;    

            childGrid.Children.Add(border1);
            g.Children.Add(childGrid);
            return (g);

其中“g”只有1列和“LoopCount”行数。它对我有用。

答案 1 :(得分:0)

您应该覆盖CellPainting控件的DataGridView事件,如下所示:

private void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None;
    e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;
}