2012-02-29 62 views
1

我正在開發一個簡單的內聯網建議框系統,讓員工能夠通過它提交他們的想法。現在,對於系統管理員,我列出了所有提交的建議,其中顯示了員工姓名,用戶名,部門,建議標題,建議描述以及添加顯示狀態的一列。對於狀態欄,它將顯示一個DropDownList,其中包含可能的選項,如Accepted,Rejected ...等如何立即反映提交建議狀態的更新?

這裏我有以下問題;當管理員選擇其中一個狀態時,它會被更改,但不會立即生效,我不知道爲什麼。我怎麼知道的?我在這張表下有另一個GridView,顯示上個月提交的建議。如果管理員接受例如其中一個提交的建議。這個建議不會在刷新頁面後顯示,我不知道爲什麼。

我的ASP.NET:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
         AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ID" 
         width="950px" CssClass="mGrid" 
         AlternatingRowStyle-CssClass="alt" 
         RowStyle-HorizontalAlign="Center" 
         DataSourceID="SqlDataSource1" 
         OnRowDataBound="GridView1_RowDataBound" > 
      <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
      <HeaderStyle Font-Bold = "true" ForeColor="Black" Height="20px"/> 
      <Columns> 
       <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
        ReadOnly="True" SortExpression="ID" /> 
       <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> 
       <asp:BoundField DataField="Description" HeaderText="Description" 
        SortExpression="Description" /> 
       <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
       <asp:BoundField DataField="Username" HeaderText="Username" 
        SortExpression="Username" /> 
       <asp:BoundField DataField="DivisionShortcut" HeaderText="Division" 
        SortExpression="DivisionShortcut" /> 
       <asp:TemplateField HeaderText="Status"> 
        <ItemTemplate> 
         <asp:DropDownList ID="DropDownList" runat="server" DataSourceID="SqlDataSource2" 
              Font-Bold="True" ForeColor="#006666" AppendDataBoundItems="false" 
              DataTextField="Status" DataValueField="ID" AutoPostBack="true" 
              OnDataBound="DropDownList_DataBound" OnSelectedIndexChanged ="DropDownList_SelectedIndexChanged"> 
         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
      SelectCommand="SELECT  dbo.SafetySuggestionsLog.ID, dbo.SafetySuggestionsLog.Title, dbo.SafetySuggestionsLog.Description, dbo.employee.Name, dbo.SafetySuggestionsLog.Username, 
         dbo.Divisions.DivisionShortcut 
FROM   dbo.employee INNER JOIN 
         dbo.SafetySuggestionsLog ON dbo.employee.Username = dbo.SafetySuggestionsLog.Username INNER JOIN 
         dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode" 
         FilterExpression="[DivisionShortcut] like '{0}%'"> 

         <FilterParameters> 
         <asp:ControlParameter ControlID="ddlDivision" Name="DivisionShortcut" 
               PropertyName="SelectedValue" Type="String" /> 
        </FilterParameters> 
     </asp:SqlDataSource> 

     <%--For the DropDownList--%> 
     <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
          ConnectionString="<%$ ConnectionStrings:testConnectionString %>" 
          SelectCommand="SELECT * FROM [SafetySuggestionsStatus]"> 
     </asp:SqlDataSource> 

我的代碼隱藏:

protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddl = (DropDownList)sender; 
     int suggestionStatus = int.Parse(ddl.SelectedValue); 
     GridViewRow row = (GridViewRow)ddl.NamingContainer; 
     string strID = GridView1.DataKeys[row.RowIndex]["ID"].ToString(); 
     int ID = Int32.Parse(strID); 
     //For inserting the status in the database 
     string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True"; 
     string updateCommand = "UPDATE SafetySuggestionsLog SET [StatusID] = @StatusID WHERE [ID] = @ID"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      using (SqlCommand cmd = new SqlCommand(updateCommand, conn)) 
      { 
       cmd.Parameters.Clear(); 
       cmd.Parameters.AddWithValue("@StatusID", suggestionStatus); 
       cmd.Parameters.AddWithValue("@ID", ID); 
       cmd.ExecuteNonQuery(); 
      } 
      conn.Close(); 
     } 

    } 

那麼如何解決這個問題,讓提交建議的狀態可以立即更新?

編輯:

protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddl = (DropDownList)sender; 
     int suggestionStatus = int.Parse(ddl.SelectedValue); 
     GridViewRow row = (GridViewRow)ddl.NamingContainer; 
     string strID = GridView1.DataKeys[row.RowIndex]["ID"].ToString(); 
     int ID = Int32.Parse(strID); 
     //For inserting the status in the database 
     string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True"; 
     string updateCommand = "UPDATE SafetySuggestionsLog SET [StatusID] = @StatusID WHERE [ID] = @ID"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      using (SqlCommand cmd = new SqlCommand(updateCommand, conn)) 
      { 
       cmd.Parameters.Clear(); 
       cmd.Parameters.AddWithValue("@StatusID", suggestionStatus); 
       cmd.Parameters.AddWithValue("@ID", ID); 
       cmd.ExecuteNonQuery(); 
      } 
      conn.Close(); 
     } 
     GridView1.DataBind(); 

    } 
+0

這是絕對正常的行爲 - 您需要更新gridview(通過刷新或通過輪詢等)。 – Yahia 2012-02-29 10:11:36

+0

順便說一句,你的'conn.Close();'與using語句是多餘的。 – 2012-02-29 12:32:54

回答

2

你需要你的GridView綁定到它的DataSource你已經改變後,再次它。由於您使用的是聲明式數據源,因此應該可以使用簡單的GridView1.DataBind()

+0

感謝您的幫助,但我應該把它放在哪裏?我應該刪除聲明的數據源? – 2012-02-29 10:50:15

+0

@AliAhmed:在'DropDownList_SelectedIndexChanged'的末尾。不,請使用SqlDataSource並調用GridView.DataBind,或者使用ADO.NET手動執行(我更喜歡),再次從dbms中檢索行,設置GridView的DataSource,然後調用DataBind。 – 2012-02-29 10:57:31

+0

我做了如上所示,當我更新其中一個建議的狀態時,該行代碼將更新所有建議的狀態,我不知道爲什麼。 – 2012-02-29 11:31:16