Ok, so a few things here. First - try not to do string concatenation using + in C#, unless you're concatenating constant expressions (which DateTime.Now and Page.User.Identity.Name are not). Use a StringBuilder instead. Strings in C# are immutable.
Second, you can just add a custom attribute to your textboxes and collect their value server-side; there's no need for additional hidden fields.
So, given an example form like: -
<asp:TextBox ID="txtAuditLogReadOnly" runat="server" />
<div id="divContainer" runat="server">
<asp:TextBox ID="t1" runat="server" fieldname="First Name" />
<asp:TextBox ID="t2" runat="server" fieldname="Last Name" />
<asp:TextBox ID="t3" runat="server" fieldname="Shoe Size" />
<asp:TextBox ID="t4" runat="server" fieldname="Banana" />
</div>
(Note 'fieldname' attribute)
You could scrape the values into your audit log like so: -
var builder = new StringBuilder(
string.Format("{0}{1}{2:dd/MM/yyyy hh:mm}- (Incident saved by: {3})",
txtAuditLogReadOnly.Text,
Environment.NewLine,
DateTime.Now,
Page.User.Identity.Name));
var controls = from Control c in divContainer.Controls
select c;
foreach (var ctl in controls)
{
if (ctl is TextBox)
{
var txt = (TextBox)ctl;
if (!string.IsNullOrEmpty(txt.Text))
{
string fieldname = txt.Attributes["fieldname"];
builder.AppendFormat(" - with changes to {0}", fieldname);
}
}
}
return builder.ToString();