Как добавить ссылку на метод в пользовательском элементе управления в дочерний элемент управления, созданный в этом же пользовательском элементе управления - PullRequest
0 голосов
/ 03 февраля 2010

У меня есть пользовательский элемент управления, основанный на элементе управления 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;
                }
            }
        }

1 Ответ

1 голос
/ 03 февраля 2010

Ваш пользовательский элемент управления GridView должен подписаться на событие CheckChanged флажков. Он должен вызывать свой метод SaveCheckBoxState самостоятельно. Этот метод должен быть закрытым.

Родительский и дочерний элементы управления должны взаимодействовать только через свойства и события, но не через методы и поля.

...