繁体   English   中英

GridView RowUpdating期间缺少动态添加的控件

[英]Dynamically added controls missing during GridView RowUpdating

我有一个带有TemplateField列的GridView,将PlaceHolder控件放入其中。在GridView的DataBound事件期间,我向PlaceHolder动态添加了一些CheckBoxes。 效果很好,并按预期显示。

我的问题是在RowUpdating事件期间,PlaceHolder不包含任何控件。 我的复选框不见了。 我还注意到在RowEditing事件期间缺少它们。

我希望能够在RowUpdating事件期间获取CheckBoxes的值,以便将其保存到数据库中。

这是一些示例代码。 为了减少尺寸,我已经进行了很多调整,但是如果您想查看详细信息,请提出要求,我们将乐意添加更多内容。

HTML:

<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="False" 
    ondatabound="gridView_DataBound" onrowupdating="gridView_RowUpdating" 
    onrowediting="gridView_RowEditing" DataKeyNames="ID">
    <Columns>
        <asp:TemplateField HeaderText="Countries">
            <ItemTemplate>
                <asp:PlaceHolder ID="countriesPlaceHolder" runat="server"></asp:PlaceHolder>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:PlaceHolder ID="countriesPlaceHolder" runat="server"></asp:PlaceHolder>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="editButton" runat="server" CommandName="Edit" Text="Edit"></asp:LinkButton>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:LinkButton ID="updateButton" runat="server" CommandName="Update" Text="Update"></asp:LinkButton>
            </EditItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

后面的代码:

// This method works fine, no obvious problems here.
protected void gridView_DataBound(object sender, EventArgs e)
{
    // Loop through the Holidays that are bound to the GridView
    var holidays = (IEnumerable<Holiday>)gridView.DataSource;
    for (int i = 0; i < holidays.Count(); i++)
    {
        // Get the row the Holiday is bound to
        GridViewRow row = gridView.Rows[i];
        // Get the PlaceHolder control
        var placeHolder = (PlaceHolder)row.FindControl("countriesPlaceHolder");
        // Create a CheckBox for each country and add it to the PlaceHolder
        foreach (Country country in this.Countries)
        {
            bool isChecked = holidays.ElementAt(i).Countries.Any(item => item.ID == country.ID);
            var countryCheckBox = new CheckBox
            {
                Checked = isChecked,
                ID = country.Abbreviation + "CheckBox",
                Text = country.Abbreviation
            };
            placeHolder.Controls.Add(countryCheckBox);
        }
    }
}

protected void gridView_RowEditing(object sender, GridViewEditEventArgs e)
{
    // EXAMPLE: I'm expecting checkBoxControls to contain my CheckBoxes, but it's empty.
    var checkBoxControls = gridView.Rows[e.NewEditIndex].FindControl("countriesPlaceHolder").Controls;

    gridView.EditIndex = e.NewEditIndex;
    BindData();
}

protected void gridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    // EXAMPLE: I'm expecting checkBoxControls to contain my CheckBoxes, but it's empty.
    var checkBoxControls = ((PlaceHolder)gridView.Rows[e.RowIndex].FindControl("countriesPlaceHolder")).Controls;

    // This is where I'd grab the values from the controls, create an entity, and save the entity to the database.

    gridView.EditIndex = -1;
    BindData();
}

这是我遵循的数据绑定方法文章: http : //www.aarongoldenthal.com/post/2009/04/19/Manually-Databinding-a-GridView.aspx

您需要在页面加载时调用BindData()方法。

“由于控件的工作方式,需要在每次页面加载时重新创建动态控件或列。动态控件不会保留,因此您必须在每个页面回发时重新加载它们;但是,这些控件的视图状态将保留。”

请参阅gridview中的单元格失去对RowUpdating事件的控制

同样,在您链接的文章中,还有一个ItemTemplate和一个EditItemTemplace,因为它们具有不同的显示,即只读和可编辑。 您的相同,所以我认为您可以简化设计:

<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="False" DataKeyNames="ID" ondatabound="gridView_DataBound">
<Columns>
    <asp:TemplateField HeaderText="Countries">
        <ItemTemplate>
            <asp:PlaceHolder ID="countriesPlaceHolder" runat="server"></asp:PlaceHolder>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField ShowHeader="False">
        <ItemTemplate>
            <asp:LinkButton ID="editButton" runat="server" Text="Edit" onclick="editButton_Click" ></asp:LinkButton>
            <asp:LinkButton ID="updateButton" runat="server" Text="Update" onclick="updateButton_Click" ></asp:LinkButton>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>
</asp:GridView>

背后的代码:

    protected void gridView_DataBound(object sender, EventArgs e)
    {
        // Loop through the Holidays that are bound to the GridView
        var holidays = (IEnumerable<Holiday>)gridView.DataSource;
        for (int i = 0; i < holidays.Count(); i++)
        {
            // Get the row the Holiday is bound to
            GridViewRow row = gridView.Rows[i];
            // Get the PlaceHolder control
            var placeHolder = (PlaceHolder) row.FindControl("countriesPlaceHolder");
            var countryCheckBox = new CheckBox
                                      {
                                          Checked = true,
                                          ID = "auCheckBox",
                                          Text = "Aus",
                                          Enabled = false
                                      };
            placeHolder.Controls.Add(countryCheckBox);

            var editButton = (LinkButton)row.FindControl("editButton");
            editButton.CommandArgument = i.ToString();
            var updateButton = (LinkButton)row.FindControl("updateButton");
            updateButton.CommandArgument = i.ToString();
            updateButton.Visible = false;
        }
    }

    protected void editButton_Click(object sender, EventArgs e)
    {
        LinkButton editButton = (LinkButton) sender;
        int index = Convert.ToInt32(editButton.CommandArgument);

        GridViewRow row = gridView.Rows[index];
        // Get the PlaceHolder control
        LinkButton updateButton = (LinkButton)row.FindControl("updateButton");
        updateButton.Visible = true;
        editButton.Visible = false;

        CheckBox checkbox = (CheckBox)row.FindControl("auCheckBox");
        if (checkbox != null)
        {
            checkbox.Enabled = true;
            // Get value and update
        }
    }

    protected void updateButton_Click(object sender, EventArgs e)
    {
        LinkButton updateButton = (LinkButton)sender;
        int index = Convert.ToInt32(updateButton.CommandArgument);

        GridViewRow row = gridView.Rows[index];
        // Get the PlaceHolder control
        LinkButton editButton = (LinkButton)row.FindControl("updateButton");
        editButton.Visible = true;
        updateButton.Visible = false;

        CheckBox checkbox = (CheckBox)row.FindControl("auCheckBox");
        if (checkbox != null)
        {
            // Get value and update

            checkbox.Enabled = false;
        }
    }

如果您想一开始就启用它,只需删除已启用的检查,就可以删除编辑按钮。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM