У меня есть пользовательский элемент управления, основанный на элементе управления gridview, расположенном по адресу: здесь
Элемент управления в основном представляет собой вид сетки, который автоматически создает столбец флажков, которые можно использовать для «проверки» отдельных строк в виде сетки.
Во время события вида сетки CreateColumns «флажок-столбец» создается динамически. Флажок checkboxcolumn также содержит еще один флажок в заголовке, который используется для «выбора / отмены выбора всех» флажков в столбце.
Поскольку gridview автоматически не запоминает состояние флажков в столбце checkbox при обратной передаче, я добавил в элемент управления метод SaveCheckBoxState, который хранит индексы проверенных строк в Viewstate, а затем изменил OnRowDataBound "событие, чтобы проверить Viewstate и сбросить флажки на основе Viewstate.
Затем я добавил вызов «SaveCheckBoxState» в событиях OnSorting и OnPageIndexChanging сетки вида. Это прекрасно работает, пока я сортирую или меняю страницы.
Однако мне нужно обновлять состояние просмотра каждый раз, когда кто-то щелкает или снимает один из флажков. В настоящее время флажки отображаются с событием onclick, которое вызывает некоторый javascript для выделения строки или, в случае флажка в заголовке, для выбора / отмены выбора всех флажков.
Мне нужно вызвать метод «SaveCheckBoxState» из javascript, используемого customcontrol, или мне нужно найти способ изменить viewstate из javascript и выполнить то же действие, что и «SaveCheckBoxState».
Я пытался добавить «SaveCheckBoxState» к объявлению события onclick в флажках, но при запуске он просто сообщает мне, что метод не определен. Его нет на родительской странице, и я не думаю, что мне нужно было бы создавать событие для родительской страницы, чтобы передать клик. Мне кажется, все это должно содержаться внутри пользовательского элемента управления.
Кто-нибудь знает, как мне этого добиться?
Вот код для события OnPreRender сетки, в котором установлено событие onclick флажка:
protected override void OnPreRender(EventArgs e)
{
// Do as usual
base.OnPreRender(e);
// Adjust each data row
foreach (GridViewRow r in Rows)
{
// Get the appropriate style object for the row
TableItemStyle style = GetRowStyleFromState(r.RowState);
// Retrieve the reference to the checkbox
CheckBox cb = (CheckBox)r.FindControl(InputCheckBoxField.CheckBoxID);
// Build the ID of the checkbox in the header
string headerCheckBoxID = String.Format(CheckBoxColumHeaderID, ClientID);
// Add script code to enable selection
cb.Attributes["onclick"] = String.Format("ApplyStyle(this, '{0}', '{1}', '{2}')",
SelectedRowStyle.CssClass,
style.CssClass,
headerCheckBoxID);
// Update the style of the checkbox if checked
if (cb.Checked)
{
r.BackColor = SelectedRowStyle.BackColor;
r.ForeColor = SelectedRowStyle.ForeColor;
r.Font.Bold = SelectedRowStyle.Font.Bold;
}
else
{
r.BackColor = style.BackColor;
r.ForeColor = style.ForeColor;
r.Font.Bold = style.Font.Bold;
}
}
}