I tried your code but I can't seem to get the same behavior. For me the HiddenFields are persistent, just as you want. I think you need to include to supply some of your code behind code to be able to see if there is something strange going on there.
I'll Supply my test code so you can have a look:
My view:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Webtest.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="RpPrograms" runat="server" EnableViewState="True">
<HeaderTemplate>
<table id="tablePrograms" class="display">
<thead>
<tr>
<th>Checkbox</th>
<th>Program</th>
<th>Company Name</th>
</tr>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<div id='<%# "ProgramCbxCol_" + Eval("ProgramID").ToString()%>'>
<asp:checkbox runat="server" ID="cbxProgram" />
<asp:HiddenField ID="hdnProgramID" runat="server" Value='<%# Eval("ProgramID")%>' />
<asp:HiddenField ID="hdnProgramTagName" runat="server" Value='<%# Eval("Program") + "(" + Eval("CompanyName") + ")"%>'/>
</div>
</td>
<td><asp:label runat="server" ID="ProgramName" Text='<%# Eval("Program") + "(" + Eval("ProgramID").ToString() + ")"%>'></asp:label></td>
<td><%#Eval("CompanyName")%></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<asp:Button runat="server" Text ="Save"/>
</div>
</form>
</body>
</html>
My codebehind:
using System;
using System.Collections.Generic;
namespace Webtest
{
public partial class WebForm1 : System.Web.UI.Page
{
private List<ProgramData> _programData = new List<ProgramData>
{
new ProgramData {ProgramID = 1, Program = "Program abc", CompanyName = "Company 3434"},
new ProgramData {ProgramID = 2, Program = "Program def", CompanyName = "Company 3qa2434"},
};
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
RpPrograms.DataSource = _programData;
RpPrograms.DataBind();
}
}
}
public class ProgramData
{
public int ProgramID { get; set; }
public string Program { get; set; }
public string CompanyName { get; set; }
}
}