Cara mengatur posisi baris dan kolom Grid secara terprogram

93

Saya memiliki dua Grid di dalam Stackpanel. Grid pertama dinamai GridX. Awalnya, di dalam kisi, ada larik 2D Kotak Teks (RowDefs / ColumnDefs). Definisi TextBox di XAML adalah

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

Saya ingin menambahkan TextBlock secara terprogram di posisi yang sama sebagai bagian dari GridX.

Efeknya pasti seperti ini

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

Bagaimana menambahkan ini. Saya sudah mencoba ini:

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

Tapi gagal.

Sekali lagi saya mencoba ini:

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;    

Sekarang masalahnya adalah TextBlock tidak terlihat. TextBox menyembunyikannya. Saya menghargai bantuan Anda.

Vinod
sumber
Kode diperbarui. Sekarang masalahnya adalah visibilitas textblock
Vinod

Jawaban:

162

Untuk properti terlampir Anda dapat memanggil SetValue pada objek yang ingin Anda tetapkan nilainya:

tblock.SetValue(Grid.RowProperty, 4);

Atau panggil metode Set statis (bukan sebagai metode instance seperti yang Anda coba) untuk properti pada tipe pemilik, dalam hal ini SetRow:

Grid.SetRow(tblock, 4);
John Bowen
sumber
SetRow bekerja sementara SetValue tidak: itu meninggalkan baris apa adanya (nol dalam kasus saya)
Anton Tropashko
1
Anda perlu memastikan bahwa instance TextBlock adalah bagian dari instance Grid, Anda dapat melakukan ini: mygrid.Children.Add (myTextBlock);
Rodrigo Caballero
Jangan lupa gunakan dispatcher saat Anda perlu menjalankan perubahan pada runtime. Itu kasus saya.
Hagen
32

Berikut adalah contoh yang mungkin bisa membantu seseorang:

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
sumber
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
sumber
1

Coba ini:

                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
sumber