Spróbuj może tak:
public partial class SudokuForm : Form
{
private TextBox[,] _textBoxes;
public ChildForm()
{
InitializeComponent();
InitializeTextBoxes();
}
private void InitializeTextBoxes()
{
_textBoxes = new TextBox[9, 9];
int locationX = 0, locationY = 0, size = 20;
for (int i = 0; i < _textBoxes.GetLength(0); i++)
{
for (int j = 0; j < _textBoxes.GetLength(1); j++)
{
_textBoxes[i, j] = new TextBox();
_textBoxes[i, j].Location = new Point(locationX, locationY);//pozycja
_textBoxes[i, j].Size = new Size(size, size);//rozmiar
_textBoxes[i, j].Name = String.Format("textBox{0}{1}", i, j);//nazwa
_textBoxes[i, j].TextChanged += new EventHandler(FormTextChanged);//dodanie obsługi zdarzenia zmiany zawartości.
_textBoxes[i, j].Text = (i + j).ToString();//ustawiamy jakąś wartość
Controls.Add(_textBoxes[i, j]);//dodajemy do listy kontrolek naszej formy
locationX += size;//zmieniamy współrzędna X
}
locationY += size;//zmieniamy współrzędną Y
locationX = 0;//zerujemy współrzędną X
}
}
private void FormTextChanged(object sender, EventArgs e)
{
TextBox textBox = sender as TextBox;
//obsługa zdarzenia zmiany zawartości TextBox-a.
//zmienna textBox reprezentuje TextBox dla którego zaszła zmiana.
}
}