2012-07-20 58 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

相關問題