0

データベースからデータを取得してコントロールに入力するカスタム GridView コントロールがあります。このページでは、HeaderTemplate チェックボックス コントロールと ItemTemplate チェックボックス コントロールも作成しました。

<nm:ContactGridViewControl runat="server" ID="grdContacts">
        <Columns>
            <asp:TemplateField>
                <HeaderTemplate>
                    <asp:CheckBox runat="server" AutoPostBack="true" />
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:CheckBox runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </nm:ContactGridViewControl>

OnInit イベントで次のように GridView を設定します。アプリの速度が低下していたため、ポストバックごとに再作成しないことにしました。

protected override void OnInit(EventArgs e)
    {
        this.RowDataBound += new GridViewRowEventHandler(ContactGridViewControl_RowDataBound);
        this.RowCreated += new GridViewRowEventHandler(ContactGridViewControl_RowCreated);

        if (!Page.IsPostBack)
        {
            List<EnquiryItem> contactList = new List<EnquiryItem>();
            DataTable list = new DataTable();

            if (SessionManager.LoginState != null)
            {
                contactList = SiteDataLayerHandler.GetContactList(SessionManager.LoginState.UserID);
            }

            if (contactList != null)
            {
                list.Columns.Add("LeadID");
                list.Columns.Add("Name");
                list.Columns.Add("Email Address");

                foreach (EnquiryItem item in contactList)
                {
                    DataRow row = list.NewRow();

                    row["LeadID"] = item.LeadID;
                    row["Name"] = string.Format("{0} {1}", item.FirstName.ToCapitalize(), item.LastName.ToCapitalize());
                    row["Email Address"] = item.EmailAddress;

                    list.Rows.Add(row);

                }

                this.DataSource = list;
                this.DataBind();
            }
        }

        base.OnInit(e);
    }

コントロールに関連付けられたすべてのコードを 1 か所に保持するために、「OnRowDataBound」に「CheckedChanged」イベントを動的に追加しました。これは、HeaderTemplate のチェックボックス用です。理由は、このチェックボックスを「すべての行を選択/選択解除」として使用できるようにするためです。

protected void ContactGridViewControl_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex == -1) // Check if row is Header row
        {
            CheckBox chk = e.Row.GetAllControls().OfType<CheckBox>().FirstOrDefault();

            if (chk != null)
            {
                chk.CheckedChanged += new EventHandler(chk_CheckedChanged);
            }
        }
    }

次に、次のように同じページにイベント コードを配置します。

protected void chk_CheckedChanged(object sender, EventArgs e)
    {
        bool isChecked = ((CheckBox)sender).Checked;

        foreach (GridViewRow row in this.Rows)
        {
            CheckBox chkBox = row.Cells[0].Controls[0] as CheckBox;

            if (chkBox != null)
            {
                chkBox.Checked = isChecked;
            }
        }
    }

ここから問題が始まります。私のイベントは決してヒットしません!ただし、チェックボックスはポストバックします。

4

1 に答える 1

0

わかりましたので、答えはこれです。「OnRowDataBound」の代わりに「OnRowCreated」イベントに CheckedChanged イベントを割り当てる必要がありました。

protected override void OnRowCreated(GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex == -1)
        {
            CheckBox chk = e.Row.GetAllControls().OfType<CheckBox>().FirstOrDefault();

            if (chk != null)
            {
                chk.CheckedChanged += new EventHandler(chk_CheckedChanged);
            }
        }
        base.OnRowCreated(e);
    }

このようにして、イベントは毎回メソッドにヒットします

于 2012-07-05T10:28:27.993 に答える