【问题标题】:Gridview OnRowCreated event gets triggered multiple times - dropdownlist gets populated twiceGridview OnRowCreated 事件被触发多次 - 下拉列表被填充两次
【发布时间】:2011-01-20 06:02:51
【问题描述】:

附上下面的代码 - 它是一个简单的代码,它只是初始化下拉列表(调用 ddl.Clear())并添加一个带有文本“select”的项目,其值为“-1”。

Filldropdowns(ddl) 是获取特定数据并将其填充到下拉方法中的方法。这些方法在普通下拉列表的网格视图之外单独工作正常。

发生的情况是,对于每个 gridview 行,该事件处理程序会被多次调用。作为最终结果,下拉列表包含它们应该包含的值的两倍(完整的值集只是重复)。

有人知道为什么会这样吗?关闭 appenddatabounditems 不是一个选项,因为我需要将项目附加到“选择”下方。

奇怪的是,当我调试时,即使在第二次调用同一行时,它也显示 dropdownvalues 包含零个项目,然后包含所需数量的项目。但是当我到达 grdAccountsMapping_DataBound() 处理程序时,它显示的项目数是两倍。

public void grdAccountsMapping_RowCreated(object sender, GridViewRowEventArgs e)
{
    GridViewRow row = e.Row;

    if (row.RowType == DataControlRowType.DataRow)
    {
        DropDownList ddlGrdFeeFormat = (DropDownList)row.FindControl("ddlFeeFormat");
        DropDownList ddlGrdTransactionMode = (DropDownList)row.FindControl("ddlTransactionMode");
        DropDownList ddlGrdFeeParticular = (DropDownList)row.FindControl("ddlFeeParticular");
        DropDownList ddlGrdCompany = (DropDownList)row.FindControl("ddlCompany");
        DropDownList ddlGrdAccounts = (DropDownList)row.FindControl("ddlAccounts");
        DropDownList ddlGrdFeeBook = (DropDownList)row.FindControl("ddlFeeBook");

        InitializeDropdown(ddlGrdFeeBook);
        InitializeDropdown(ddlGrdFeeFormat);
        InitializeDropdown(ddlGrdTransactionMode);
        InitializeDropdown(ddlGrdFeeParticular);
        InitializeDropdown(ddlGrdCompany);

        getDDLValues.FillFeeBooks(ddlGrdFeeBook);
        getDDLValues.FillFeeFormats(ddlGrdFeeFormat);
        getDDLValues.FillPaymentModes(ddlGrdTransactionMode);
        getDDLValues.FillFeeParticulars(ddlGrdFeeParticular);
        getDDLValues.FillAccountingCompanies(ddlGrdCompany);
    }
}

aspx 页面网格定义如下所示

<asp:GridView CssClass="Grid" ID="grdAccountsMapping" runat="server" Width="98%"
EmptyDataText="No records found in this section" EmptyDataRowStyle-Height="40px"
AutoGenerateColumns="False" AccessKey="2" DataKeyNames="FAM_MAP_ID" OnRowCommand="grdAccountsMapping_RowCommand"
OnRowCreated="grdAccountsMapping_RowCreated" OnDataBound="grdAccountsMapping_DataBound"
Visible="false">
<AlternatingRowStyle CssClass="alternateGridItem" HorizontalAlign="Left" />
<RowStyle CssClass="gridItem" HorizontalAlign="Left" />
<EmptyDataRowStyle CssClass="gridItem" HorizontalAlign="Center" Font-Bold="True"
    ForeColor="Red" Height="40px" VerticalAlign="Middle" />
<HeaderStyle CssClass="tabledarklabel" />
<FooterStyle CssClass="Grid_Footer" />
<Columns>
    <asp:TemplateField HeaderText="Fee Book">
        <ItemTemplate>
            <asp:DropDownList ID="ddlGrdFeeBook" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True">
            </asp:DropDownList>
        </ItemTemplate>
        <ItemStyle HorizontalAlign="Center" />
        <HeaderStyle Width="5%" />
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Fee Format">
        <ItemTemplate>
            <asp:DropDownList ID="ddlGrdFeeFormat" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True">
            </asp:DropDownList>
        </ItemTemplate>
        <ItemStyle HorizontalAlign="Center" />
        <HeaderStyle Width="5%" />
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Transaction Mode">
        <ItemTemplate>
            <asp:DropDownList ID="ddlGrdTransactionMode" CssClass="dropdownwidth3" runat="server"
                AppendDataBoundItems="True" >
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Fee Particulars">
        <ItemTemplate>
            <asp:DropDownList ID="ddlGrdFeeParticular" CssClass="dropdownwidth3" runat="server"
                AppendDataBoundItems="True">
            </asp:DropDownList>
        </ItemTemplate>
        <ItemStyle HorizontalAlign="Center" />
        <HeaderStyle Width="5%" />
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Company">
        <ItemTemplate>
            <asp:DropDownList ID="ddlGrdCompany" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True">
            </asp:DropDownList>
        </ItemTemplate>
        <ItemStyle HorizontalAlign="Center" />
        <HeaderStyle Width="5%" />
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Account">
        <ItemTemplate>
            <asp:DropDownList ID="ddlGrdAccounts" CssClass="dropdownwidth3" runat="server" AppendDataBoundItems="True">
            </asp:DropDownList>
        </ItemTemplate>
        <ItemStyle HorizontalAlign="Center" />
        <HeaderStyle Width="5%" />
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Active">
        <ItemTemplate>
            <asp:CheckBox ID="chkActive" runat="server" />
        </ItemTemplate>
        <ItemStyle HorizontalAlign="Center" />
        <HeaderStyle Width="5%" />
    </asp:TemplateField>
</Columns>
<PagerSettings Visible="False" />
<PagerStyle BorderStyle="None" />
</asp:GridView>

使用的其他方法只是检索所需数据的数据集,将其分配给下拉列表的数据源,然后将其绑定到下拉列表控件。这些方法在网格外的下拉菜单上运行良好,我已经对它们进行了单元测试——所以我确信问题不存在。

【问题讨论】:

  • 我能想到的唯一原因是您可能已经多次订阅 RowCreated(在您的情况下是两次),可能一次是在标记中,另一次是在代码隐藏中。
  • 不,我也发布了标记 - 文件后面的代码中没有发生订阅。
  • 我现在通过使用 RowDataBound 事件处理程序而不是上面的方法解决了这个问题 - 它工作正常。但我仍然想知道为什么上述方法不起作用。

标签: c# asp.net gridview event-handling


【解决方案1】:

你是如何绑定网格的?您是否不小心多次调用 DataBind() 和/或 Rebind()?

【讨论】:

  • 不,它只绑定一次。
  • 您能否发布完整的代码...根据您最初发布的内容很难判断会发生什么。
  • 当调用到 gridviewrows 之外的下拉菜单时,所有方法调用都可以正常工作 - 只有网格才会出现问题。所以我将问题的范围仅限于这段代码。
  • 好吧,如果您没有在代码隐藏中以及在 aspx 中以声明方式订阅 OnRowCreated,或者多次绑定/重新绑定,那确实很奇怪!
【解决方案2】:

我们刚刚删除了文件并再次创建它,它似乎工作。由于我们在截止日期前,我没有太多时间深入研究细节,但那个奇怪的问题没有再次发生!

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多