2012-07-20 57 views
1

在任何人回答这个之前,我发现了我的代码中的错误,并在下面发布了我的答案。我将这个问题留下来(除非有人真正关心)作为一个警示故事,以便始终绑定您的冒险GridView。使用ASP.NET WebForms的控制在奇数方式为什么我的GridView切换到编辑模式?


前言/背景

我(AB)。我知道。

我正在研究一个应用程序,希望学生列出他们参加过的一些学校活动。学生可以添加多行,并且 - 仅用于一般工作流程原因 - 我决定将显示的GridView他们的“已保存”条目来自他们添加/更新其活动的“详细信息”区域。

编辑/更新件工作得很好。我可以添加新项目,使用与我的课程相关的烘焙验证(这是所有额外的span标记具有class="error"属性显示)。我真的想做出这个傻瓜证明,所以他们点击添加新活动的按钮也会验证并将他们的信息添加到GridView(提供的项目通过验证),清除详细信息控件,并且表现正常。

问题描述

我开始这方面的一些基本的测试,结果发现,如果我编辑活动,打破了该类中的验证规则中的一个(或多个),然后单击“添加新活动“按钮,我的GridView将该行从EditItemTemplate恢复为正常的ItemTemplate

据我所知,我的EditIndex从来没有偏离我仍在编辑的行。实际上,如果我触发另一个回传,GridView会显示正确的EditIndex

我试过重新设置EditIndex并将我的e.Cancel = true转换为return声明。没有任何工作。考虑到EditIndex's值通过多次回传保持不变,我必须认为这里有些奇怪的事情发生。

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

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

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> 

“详细资料” 部分

<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> 

的C#的长度滔天,但对于任何勇敢的灵魂:

void addActivity_ServerClick(object sender, EventArgs e) 
{ 
    AddSchoolActivity(); 
} 

private bool AddSchoolActivity() 
{ 
    ResetSchoolActivityErrors(); 
    SchoolActivity activityToAdd = GetSchoolActivity(); 

    try 
    { 
     SessionApplication.SchoolActivities.Add(activityToAdd); 

     BindSchoolActivities(); 
     ResetSchoolActivityFields(); 
     HideSchoolActivityFields(); 
    } 
    catch (BrokenRuleException) 
    { 
     MapSchoolActivityErrors(activityToAdd); 
     return false; 
    } 

    return true; 
} 

void updateActivity_ServerClick(object sender, EventArgs e) 
{ 
    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); 
     return false; 
    } 

    return true; 
} 

private SchoolActivity GetSchoolActivity() 
{ 
    SchoolActivity currentActivity = new SchoolActivity(); 

    currentActivity.Details = schoolActivityDetails.Value; 

    TryGetSchoolActivityMonthsPerYear(currentActivity); 
    TryGetSchoolActivityDate(currentActivity); 
    TryGetSchoolActivityTotalHours(currentActivity); 

    return currentActivity; 
} 

private void TryGetSchoolActivityMonthsPerYear(SchoolActivity currentActivity) 
{ 
    byte monthsPerYear; 

    if (byte.TryParse(schoolActivityMonthsPerYear.Value, out monthsPerYear)) 
    { 
     currentActivity.MonthsPerYear = monthsPerYear; 
    } 
} 

private void TryGetSchoolActivityDate(SchoolActivity currentActivity) 
{ 
    short activityDate = -1; 

    if (short.TryParse(schoolActivityDate.Value, out activityDate)) 
    { 
     currentActivity.ActivityDate = activityDate; 
    } 
} 

private void TryGetSchoolActivityTotalHours(SchoolActivity currentActivity) 
{ 
    short totalHours = -1; 

    if (schoolActivityTotalHours.Value.IsNullOrWhiteSpace() == false 
     && short.TryParse(schoolActivityTotalHours.Value, out totalHours)) 
    { 
     currentActivity.TotalHours = totalHours; 
    } 
} 

private void ResetSchoolActivityFields() 
{ 
    schoolActivityDetails.Value = string.Empty; 
    schoolActivityMonthsPerYear.SelectedIndex = 0; 
    schoolActivityDate.SelectedIndex = 0; 
    schoolActivityTotalHours.Value = string.Empty; 
} 

private void HideSchoolActivityFields() 
{ 
    schoolActivityFields.Visible = false; 
} 

private void MapSchoolActivityErrors(int activityIndex) 
{ 
    SchoolActivity updatedActivity = SessionApplication.SchoolActivities[activityIndex]; 

    MapSchoolActivityErrors(updatedActivity); 
} 

private void MapSchoolActivityErrors(SchoolActivity updatedActivity) 
{ 
    foreach (RuleViolation currentViolation in updatedActivity.GetRuleViolations()) 
    { 
     schoolActivityErrorMapping[currentViolation].InnerText = currentViolation.ErrorMessage; 
    } 
} 

private void ResetSchoolActivityErrors() 
{ 
    foreach (RuleViolation currentViolation in schoolActivityErrorMapping.Keys) 
    { 
     schoolActivityErrorMapping[currentViolation].InnerText = string.Empty; 
    } 
} 

void schoolActivities_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    if (schoolActivities.EditIndex != e.NewEditIndex 
     && schoolActivities.EditIndex != -1) 
    { 
     ResetSchoolActivityErrors(); 
     SchoolActivity activityToUpdate = GetSchoolActivity(); 

     try 
     { 
      SessionApplication.SchoolActivities[schoolActivities.EditIndex] = activityToUpdate; 
     } 
     catch (BrokenRuleException) 
     { 
      MapSchoolActivityErrors(activityToUpdate); 
      e.Cancel = true; 
     } 
    } 

    if (e.NewEditIndex != -1) 
    { 
     SchoolActivity activityToEdit = SessionApplication.SchoolActivities[e.NewEditIndex]; 

     SetSchoolActivityFields(activityToEdit); 
     ShowSchoolActivityFields(); 
     ShowModifyActivityButtons(); 
    } 

    SetSchoolActivitiesEditIndex(e.NewEditIndex); 
    BindSchoolActivities(); 
} 

private void ShowModifyActivityButtons() 
{ 
    addActivity.Visible = false; 
    updateActivity.Visible = true; 
    cancelEditActivity.Visible = true; 
    deleteActivity.Visible = true; 
} 

private void SetSchoolActivityFields(SchoolActivity activityToEdit) 
{ 
    schoolActivityDetails.Value = activityToEdit.Details; 
    schoolActivityMonthsPerYear.Value = activityToEdit.MonthsPerYear.ToString(); 
    schoolActivityDate.Value = activityToEdit.ActivityDate.ToString(); 
    schoolActivityTotalHours.Value = activityToEdit.TotalHours.ToString(); 
} 

private bool ShowSchoolActivityFields() 
{ 
    return schoolActivityFields.Visible = true; 
} 

private void BindSchoolActivities() 
{ 
    schoolActivities.DataSource = SessionApplication.SchoolActivities; 
    schoolActivities.DataBind(); 
} 

void newActivity_ServerClick(object sender, EventArgs e) 
{ 
    if (SessionApplication.SchoolActivities.Count < SchoolActivityList.Rules.MaxCount) 
    { 
     if (schoolActivities.EditIndex != -1) 
     { 
      if (UpdateSchoolActivity() == false) 
      { 
       return; 
      } 
     } 
     else if (schoolActivityFields.Visible) 
     { 
      if (AddSchoolActivity() == false) 
      { 
       return; 
      } 
     } 

     ShowSchoolActivityFields(); 
     ShowAddActivityButtons(); 
    } 
} 

private void ShowAddActivityButtons() 
{ 
    addActivity.Visible = true; 
    updateActivity.Visible = false; 
    cancelEditActivity.Visible = false; 
    deleteActivity.Visible = false; 
} 

void ResetSchoolActivitiesEditIndex() 
{ 
    SetSchoolActivitiesEditIndex(-1); 
} 

void SetSchoolActivitiesEditIndex(int rowIndex) 
{ 
    schoolActivities.EditIndex = rowIndex; 
} 

回答

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; 
} 
+0

LOL我有时会看到我已经发布,以及只有在我的问题:d – 2012-07-20 17:05:04

相关问题