-1

I am learning algorithmics and C#, and I wanted to write a sudoku solver with some WPF interface. I need 81 textboxes (one for each sudoku box) and I wanted to generate them with code and put them in array, instead of having 81 different objects. I used the Visual Studio toolbox to drag and drop buttons in my main window. I also drag and dropped TextBoxes to get an idea how they would look like.

I don't find how to add the TextBoxes to the main Window, using a loop.

Here is the MainWindow.x.aml code :

<Window x:Class="SudokuPOO.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SudokuPOO"
    mc:Ignorable="d"
    Title="Solveur de Sudoku" Height="260" Width="210">
<Grid>
<!--
    <TextBox x:Name="T0" HorizontalAlignment="Left" Margin=" 10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="20"/>
    <TextBox x:Name="T1" HorizontalAlignment="Left" Margin=" 30,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="20"/>
    [ I DELETED STUFF HERE ]

-->
    <Button Content="Résoudre" HorizontalAlignment="Left" Margin="10,210,0,0" VerticalAlignment="Top" Click="Resoudre"/>
    <Button Content="Effacer tout" HorizontalAlignment="Left" Margin="75,210,0,0" VerticalAlignment="Top" Click="Effacer"/>

</Grid>

Here is the MainWindow.x.aml.cs I am trying to edit :

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent(); // Was already here.
        GenerateTextBoxes();   // I added that manually.
    }
    public void GenerateTextBoxes()
    {
        TextBox[] TextBoxes = new TextBox[5];
        for (int i = 0; i<=4; i++)
        {
            TextBox TBox = new TextBox();
            TBox.Margin = new Thickness(10+20*i, 10, 0, 0);
            TBox.Text = i.ToString();
            TBox.Width = 20;
            TBox.Height = 20;
            // this.Controls.Add(TBox); // Doesn't work. 
            this.Content = TBox; // Trouble here.
            TextBoxes[i] = TBox;
        }
    }
}

I tried with only 5 textboxes to understand what is happening. This code runs, it displays the MainWindow, but with only one TextBox with "4" in it. My guess is that

this.Content = Tbox;

replaces all content of the window with only one TBox. How do I a just add the Tbox ? The XAML files suggests that a "TextBox" is inside a "Grid" that is inside the "MainWindow", but "this.Grid" doesn't exist, neither "MainWindow.Grid".

I tried stuff like "LayoutRoot.Children.Add", "this.Controls.Add", "this.Grid.Add" and so on, nothing works. Almost all the code I can find online related to TextBox in C# uses "Windows Forms" and not "WPF" and doesn't work in my case (like how to define an array of textboxes in c#? ).

BOUHL R.
  • 31
  • 4

1 Answers1

1

Give the root panel in the XAML markup a name:

<Grid x:Name="grid">

...and then add the textboxes to the panel's Children collection:

grid.Children.Add(TBox);

Also note that that there might be better panels to use for layout instead of mocking around with margins: https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/panels-overview?view=netframeworkdesktop-4.8

mm8
  • 163,881
  • 10
  • 57
  • 88