Использование CheckBoxList с включенным ViewState охватит вторую часть. Установка значения ListItem в CheckBoxList на что-то вроде имени битового столбца упростит использование cbl.Items.FindByValue ("colName"). Checked = colValue и colValue = cbl.Items.FindByValue ("colName" ). Проверено для загрузки и сохранения состояния.
РЕДАКТИРОВАТЬ: Если вы должны использовать подход StringBuilder
Быстрый и грязный способ состоит в том, чтобы просто создать разметку и установить значения во время циклического перебора набора записей, убедившись, что при обратной передаче вы сохраняете значение в БД, прежде чем читать значения из нее. Если вы перепутаете порядок сохранения / загрузки, БД обновится, но пользователь увидит старые значения при обновлении страницы, и если они снова нажмут кнопку «Сохранить», они перезапишут новые значения старыми.
Если вам нужно облегчить нагрузку на БД, то на пост обратно [т.е. if (Page.IsPostBack)] вместо этого загружает значения из Request.Form ["chkBxName"].
Я не думаю, что есть очень удобный способ сделать это без создания вашей собственной среды, подобной ViewState.