Cómo establecer posiciones de filas y columnas de la cuadrícula mediante programación

89

Tengo dos Grids dentro de un Stackpanel. La primera cuadrícula se llama GridX. Inicialmente, dentro de la cuadrícula, hay una matriz 2D de Textboxes (RowDefs / ColumnDefs). La definición de TextBox en XAML es

<TextBox x:Name="A1" Grid.Row="4" Grid.Column="5" TextAlignment="Center" />

Quiero agregar un TextBlock mediante programación en la misma posición que parte de GridX.

El efecto debe ser así

<TextBlock Grid.Row="4" Grid.Column="5"
HorizontalAlignment="Left" VerticalAlignment="Top" Text="10" FontSize="8"/>

Cómo agregar esto. He intentado esto:

TextBlock tblock = new TextBlock();
GridX.SetColumn(tblock, cIndex);
GridX.SetRow(tblock, rIndex);

Pero falló.

De nuevo probé esto:

int rIndex = Grid.GetRow(txtBox);
int cIndex = Grid.GetColumn(txtBox);                               

TextBlock tblock = new TextBlock();
tblock.VerticalAlignment = VerticalAlignment.Top;
tblock.HorizontalAlignment = HorizontalAlignment.Left;
tblock.FontSize = 8;
tblock.Text = rc[i, j - 1];

Grid.SetColumn(tblock, cIndex);
Grid.SetRow(tblock, rIndex);

txtBox.MaxLength = 1;    

Ahora el problema es que TextBlock no es visible. TextBox lo oculta. Aprecio tu ayuda.

Vinod
fuente
El código se actualizó Ahora el problema es la visibilidad del bloque de texto
Vinod

Respuestas:

158

Para las propiedades adjuntas, puede llamar a SetValue en el objeto para el que desea asignar el valor:

tblock.SetValue(Grid.RowProperty, 4);

O llame al método Set estático (no como un método de instancia como lo intentó) para la propiedad en el tipo de propietario, en este caso SetRow:

Grid.SetRow(tblock, 4);
John Bowen
fuente
SetRow funcionó mientras que SetValue no: dejaba la fila como está (cero en mi caso)
Anton Tropashko
1
Debe asegurarse de que la instancia de TextBlock sea parte de la instancia de Grid, puede hacer esto: mygrid.Children.Add (myTextBlock);
Rodrigo Caballero
No olvide utilizar un despachador cuando necesite ejecutar el cambio en tiempo de ejecución. Ese fue mi caso.
Hagen
31

Aquí hay un ejemplo que podría ayudar a alguien:

Grid test = new Grid();
test.ColumnDefinitions.Add(new ColumnDefinition());
test.ColumnDefinitions.Add(new ColumnDefinition());
test.RowDefinitions.Add(new RowDefinition());
test.RowDefinitions.Add(new RowDefinition());
test.RowDefinitions.Add(new RowDefinition());

Label t1 = new Label();
t1.Content = "Test1";
Label t2 = new Label();
t2.Content = "Test2";
Label t3 = new Label();
t3.Content = "Test3";
Label t4 = new Label();
t4.Content = "Test4";
Label t5 = new Label();
t5.Content = "Test5";
Label t6 = new Label();
t6.Content = "Test6";

Grid.SetColumn(t1, 0);
Grid.SetRow(t1, 0);
test.Children.Add(t1);

Grid.SetColumn(t2, 1);
Grid.SetRow(t2, 0);
test.Children.Add(t2);

Grid.SetColumn(t3, 0);
Grid.SetRow(t3, 1);
test.Children.Add(t3);

Grid.SetColumn(t4, 1);
Grid.SetRow(t4, 1);
test.Children.Add(t4);

Grid.SetColumn(t5, 0);
Grid.SetRow(t5, 2);
test.Children.Add(t5);

Grid.SetColumn(t6, 1);
Grid.SetRow(t6, 2);
test.Children.Add(t6);
Dave
fuente
1
for (int i = 0; i < 6; i++)
{
    test.ColumnDefinitions.Add(new ColumnDefinition());

    Label t1 = new Label();
    t1.Content = "Test" + i;

    Grid.SetColumn(t1, i);
    Grid.SetRow(t1, 0);
    test.Children.Add(t1);
}
KobCoder
fuente
1

Prueba esto:

                Grid grid = new Grid(); //Define the grid
                for (int i = 0; i < 36; i++) //Add 36 rows
                {
                    ColumnDefinition columna = new ColumnDefinition()
                    {
                        Name = "Col_" + i,
                        Width = new GridLength(32.5),
                    };
                    grid.ColumnDefinitions.Add(columna);
                }

                for (int i = 0; i < 36; i++) //Add 36 columns
                {
                    RowDefinition row = new RowDefinition();
                    row.Height = new GridLength(40, GridUnitType.Pixel);
                    grid.RowDefinitions.Add(row);
                }

                for (int i = 0; i < 36; i++)
                {
                    for (int j = 0; j < 36; j++)
                    {
                        Label t1 = new Label()
                        {
                            FontSize = 10,
                            FontFamily = new FontFamily("consolas"),
                            FontWeight = FontWeights.SemiBold,
                            BorderBrush = Brushes.LightGray,
                            BorderThickness = new Thickness(2),
                            HorizontalContentAlignment = HorizontalAlignment.Center,
                            VerticalContentAlignment = VerticalAlignment.Center,
                        };
                        Grid.SetRow(t1, i);
                        Grid.SetColumn(t1, j);
                        grid.Children.Add(t1); //Add the Label Control to the Grid created
                    }
                }
Kenlly Acosta
fuente