You say there is only one textbox per cell, but in your code you add both boxes to the same cell
td1.Controls.Add(t1);
td1.Controls.Add(t2);
Maybe you meant to write this instead
td1.Controls.Add(t1);
td2.Controls.Add(t2);
If that is the case then to refer to the only control in a collection just use the 0 index;
TextBox tbox = (TextBox)tbl.Rows[i].Cells[j].Controls[0];
Alternatively the below is a bit more of a robust way of handling the data and will cater for zero, one or more textboxes in a cell.
for (int i = 0; i <= tbl.Rows.Count - 1; i++)
{
for (int j = 0; j <= tbl.Rows[i].Cells.Count - 1; j++)
{
var textBoxes = tbl.Rows[i].Cells[j].Controls.OfType<TextBox>();
foreach(TextBox tbox in textBoxes)
{
Response.Write(tbox.ID);
}
}
}