为什么我的GridView切换到编辑模式?

时间:2012-07-20 16:36:52

标签: c# asp.net gridview

在有人回答之前 ,我在代码中发现了错误,并在下面发布了我的回答。我将这个问题留下来(除非有人真正关心)作为一个警示性的故事,始终绑定你的哔哔声GridView


前言/背景

我(ab)以奇怪的方式使用ASP.NET WebForms控件。我知道。

我正在开设一个应用程序,要求学生列出他们参加的一些学校活动。学生可以添加几行,并且 - 仅出于一般工作流程的原因 - 我决定将{{1}分开在“详细信息”区域显示“已保存”条目,用于添加/更新其活动。

编辑/更新部分工作得很漂亮。我可以添加新项目,使用我绑定到我的类中的烘焙验证(这是显示具有GridView属性的所有额外span标记的内容。我真的想让这个白痴证明,所以他们点击添加新活动的按钮也会验证并将他们的信息添加到class="error"(如果项目通过验证),清除详细信息控件,并表现为正常。

问题说明

我开始对此进行了一些基本测试,发现如果我编辑了一个活动,请破解该类中的一个(或多个)验证规则,然后点击“添加新活动”按钮,我的GridView将该行从GridView恢复为正常EditItemTemplate

据我所知,我的ItemTemplate从未偏离我正在编辑的行。事实上,如果我触发另一个回发,EditIndex会显示正确的GridView

我尝试重新设置EditIndex并将EditIndex切换为e.Cancel = true语句。什么都没有用。考虑到return值通过多次回发保持不变,我不得不认为这里有一些奇怪的东西。

我在下面发布了标记和C#代码。两者都是非常荒谬的 - 我重构了我的功能 - 所以我提前道歉,并感谢任何勇敢(或无聊)提供建议的人。

此外,我可以提供屏幕截图,如果有人愿意看到这种情况,而不是(或除了)阅读我的标记/代码。

EditIndex's

GridView

“详细信息”部分

<asp:GridView ID="schoolActivities" AutoGenerateColumns="false" runat="server">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button ID="edit" CommandName="Edit" runat="server" Text="Edit" />
            </ItemTemplate>
            <EditItemTemplate></EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate></HeaderTemplate>
            <ItemTemplate>
                <%# DataBinder.GetPropertyValue(Container.DataItem, "Details") %>
            </ItemTemplate>
            <EditItemTemplate>Editing...</EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>
                Months per Year
            </HeaderTemplate>
            <ItemTemplate><%# DataBinder.GetPropertyValue(Container.DataItem, "MonthsPerYear") %></ItemTemplate>
            <EditItemTemplate></EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>Date</HeaderTemplate>
            <ItemTemplate>
                <%# DataBinder.GetPropertyValue(Container.DataItem, "ActivityDate") %>
            </ItemTemplate>
            <EditItemTemplate></EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>
                Total Hours Outside Class Time
            </HeaderTemplate>
            <ItemTemplate>
                <%# DataBinder.GetPropertyValue(Container.DataItem, "TotalHours") %>
            </ItemTemplate>
            <EditItemTemplate></EditItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

C#的长度是可怕的,但对于任何勇敢的灵魂来说:

<br />
<button type="button" id="newActivity" runat="server">Add New Activity</button>
<br />

<fieldset id="schoolActivityFields" runat="server" visible="false">
    <legend>Activity</legend>

    <span>Details:</span>
    <span>
        <textarea id="schoolActivityDetails" class="schoolActivityDetails" runat="server"></textarea>
        <br />
        <span id="schoolActivityDetailsError" class="error" runat="server"></span>
    </span>
    <br />

    <span>Months per Year:</span>
    <span>
        <select id="schoolActivityMonthsPerYear" runat="server">
            <option>1</option>
            <option>2</option>
            <option>3</option>
            <option>4</option>
            <option>5</option>
            <option>6</option>
            <option>7</option>
            <option>8</option>
            <option>9</option>
            <option>10</option>
            <option>11</option>
            <option>12</option>
        </select>
    </span>
    <span id="schoolActivityMonthsPerYearError" class="error" runat="server"></span>
    <br />

    <span>Date:</span>
    <span>
        <select id="schoolActivityDate" runat="server">
            <option>2005</option>
            <option>2006</option>
            <option>2007</option>
            <option>2008</option>
            <option>2009</option>
            <option>2010</option>
            <option>2011</option>
            <option>2012</option>
        </select>
    </span>
    <span id="schoolActivityDateError" class="error" runat="server"></span>
    <br />

    <span>Total Hours:</span>
    <span>
        <input type="text" id="schoolActivityTotalHours" runat="server" />
    </span>
    <span id="schoolActivityTotalHoursError" class="error" runat="server"></span>
    <br />

    <button type="button" id="addActivity" runat="server">Add Activity</button>
    <button type="button" id="updateActivity" runat="server" visible="false">Update Activity</button>
    <button type="button" id="cancelEditActivity" runat="server" visible="false">Cancel Editing Activity</button>
    <button type="button" id="deleteActivity" runat="server" visible="false">Delete Activity</button>
</fieldset>

1 个答案:

答案 0 :(得分:0)

叹息。我错过了对绑定功能的调用。

UpdateSchoolActivity()应如下所示:

private bool UpdateSchoolActivity()
{
    ResetSchoolActivityErrors();
    SchoolActivity activityToUpdate = GetSchoolActivity();

    try
    {
        SessionApplication.SchoolActivities[schoolActivities.EditIndex] = activityToUpdate;
        ResetSchoolActivitiesEditIndex();

        BindSchoolActivities();
        ResetSchoolActivityFields();
        HideSchoolActivityFields();
    }
    catch (BrokenRuleException)
    {
        MapSchoolActivityErrors(activityToUpdate);
        SetSchoolActivitiesEditIndex(schoolActivities.EditIndex);
        BindSchoolActivities(); // That little guy? Don't worry about that little guy.
        return false;
    }

    return true;
}