如何将自定义控件中的方法的引用添加到在同一自定义控件中创建的子控件

时间:2010-02-03 18:20:10

标签: c# asp.net javascript custom-controls

我有一个基于gridview控件的自定义控件,位于:here

控件基本上是一个gridview,它自动创建一列复选框,可用于“检查”gridview中的各个行。 在gridview的“CreateColumns”事件期间,动态创建“checkboxcolumn”。 checkboxcolumn还在标题中包含另一个复选框,用于“选择/取消选择”列中的所有复选框。

由于gridview不会自动记住回发中复选框列中复选框的状态,我向控件中添加了一个名为“SaveCheckBoxState”的方法,该方法在Viewstate中存储已检查行的索引,然后我修改了“OnRowDataBound” “检查Viewstate并根据Viewstate重置复选框的事件。

然后我在gridview的OnSorting和OnPageIndexChanging事件中添加了对“SaveCheckBoxState”的调用。只要我正在整理或更改页面,这就很有效。

但是,每当有人点击或取消选中其中一个复选框时,我都需要它来更新视图状态。此时,复选框使用onclick事件呈现,该事件调用某些javascript以突出显示该行,或者在标题中的复选框的情况下,选择/取消选中所有复选框。

我需要从customcontrol使用的javascript中调用“SaveCheckBoxState”方法,或者我需要找到一种方法来修改javascript中的viewstate并执行与“SaveCheckBoxState”相同的操作。

我已经尝试将“SaveCheckBoxState”添加到复选框中的onclick事件声明中,但是在运行时,它只是告诉我该方法是未定义的。它在父页面中不存在,我认为我不应该为父页面发送一个事件来将点击传递给。在我看来,这应该是自定义控件中的所有内容。

有谁知道我怎么能实现这个目标?

以下是gridview 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 个答案:

答案 0 :(得分:1)

您应该让自定义GridView控件订阅复选框的CheckChanged事件。它应该自己调用它的SaveCheckBoxState方法。该方法应该是私有的。

父控制和子控制只能通过属性和事件进行通信,而不能通过方法和字段进行通信。