2013-08-01 234 views
1

當我點擊網格中的編輯按鈕時,它可以編輯所有字段並提供兩個選項(更新和取消)。在這個網格中,有兩個下拉列表,3個壓光機和一些文本框。如果我點擊更新,那麼數據庫中的所有文本框值都會更新,但數據庫中的所有其他字段(下拉和日曆)值都會自動爲NULL。Gridview更新不起作用

下面是主網頁的GridView代碼:

 <asp:GridView ID="GridView1" runat="server" CellPadding="5" ForeColor="#333333" width="1000px" 
       GridLines="None" OnPageIndexChanging="gridView_PageIndexChanging" 
       AllowSorting="True" OnSorting="gridView_Sorting" AutoGenerateColumns="False" OnRowUpdating="GridView1_RowUpdating" 
       BorderStyle="Outset" CellSpacing="1" Font-Names="Cambria" 
       Font-Size="Small" AllowPaging="True" ShowFooter="True" 
       ShowHeaderWhenEmpty="True" 
       DataSourceID="SqlDataSource1" onselectedindexchanged="GridView1_SelectedIndexChanged" 
       > 
       <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
       <Columns> 
        <asp:BoundField DataField="case_number" HeaderText="Case Number" 
         SortExpression="case_number" /> 
        <asp:BoundField DataField="case_name" HeaderText="Case Name" 
         SortExpression="case_name" /> 
        <asp:BoundField DataField="Case_Type_Text" HeaderText="Case Type" 
         SortExpression="Case_Type_Text" /> 

        <asp:TemplateField HeaderText="Case Status" SortExpression="Case_Status_Text"> 
         <EditItemTemplate> 
          <asp:DropDownList ID="DropDownList3" runat="server" 
          DataSourceID="SqlDataSource3" DataTextField="Case_Status_Text" DataValueField="Case_Status_Text" 
          SelectedValue='<%# Bind("Case_Status_Text") %>'> 
          </asp:DropDownList> 
         </EditItemTemplate> 
        <ItemTemplate> 
          <asp:Label ID="Label1" runat="server" Text='<%# Bind("Case_Status_Text") %>'></asp:Label> 
        </ItemTemplate> 
        </asp:TemplateField> 


        <asp:BoundField DataField="assigned_date" HeaderText="Assigned Date" 
         SortExpression="assigned_date" DataFormatString="{0:d}" /> 
        <asp:BoundField DataField="assigned_to" HeaderText="Assigned To" 
         SortExpression="assigned_to" /> 


        <asp:TemplateField HeaderText="Date Withdrawn" SortExpression="date_withdrawn"> 
         <EditItemTemplate> 
          <cc1:DatePicker ID="DatePicker5" runat="server" /> 
         </EditItemTemplate> 
         <ItemTemplate> 
          <asp:Label ID="Label4" runat="server" 
           Text='<%# Bind("date_withdrawn", "{0:d}") %>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 

        <asp:TemplateField HeaderText="Date Delivered" SortExpression="date_delivered"> 
         <EditItemTemplate> 
          <cc1:DatePicker ID="DatePicker7" runat="server" 
           /> 
         </EditItemTemplate> 
         <ItemTemplate> 
          <asp:Label ID="Label6" runat="server" 
           Text='<%# Bind("date_delivered", "{0:d}") %>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 


        <asp:TemplateField HeaderText="QC By" SortExpression="qc_by"> 
         <EditItemTemplate> 
          <asp:DropDownList ID="DropDownList5" runat="server" 
          DataSourceID="SqlDataSource4" DataTextField="User_Name" DataValueField="User_Name" 
          SelectedValue='<%# Bind("qc_by") %>'> 
          </asp:DropDownList> 
         </EditItemTemplate> 
        <ItemTemplate> 
          <asp:Label ID="Label2" runat="server" Text='<%# Bind("qc_by") %>'></asp:Label> 
        </ItemTemplate> 
        </asp:TemplateField> 


        <asp:TemplateField HeaderText="QC Date" SortExpression="qc_date"> 
         <EditItemTemplate> 
          <cc1:DatePicker ID="DatePicker6" runat="server" 
           /> 
         </EditItemTemplate> 
         <ItemTemplate> 
          <asp:Label ID="Label5" runat="server" Text='<%# Bind("qc_date", "{0:d}") %>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 

        <asp:TemplateField HeaderText="Additional Notes"> 
         <EditItemTemplate> 
          <asp:TextBox ID="TextBox1" runat="server" 
           Text='<%# Bind("additional_notes") %>' TextMode="MultiLine"></asp:TextBox> 
         </EditItemTemplate> 
         <ItemTemplate> 
          <asp:Label ID="Label3" runat="server" Text='<%# Bind("additional_notes") %>'></asp:Label> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:CommandField ShowEditButton="True" ButtonType="Button" 
         CausesValidation="False" /> 
       </Columns> 
       <EditRowStyle BackColor="#999999" /> 
       <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
       <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
       <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
       <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
       <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
       <SortedAscendingCellStyle BackColor="#E9E7E2" /> 
       <SortedAscendingHeaderStyle BackColor="#506C8C" /> 
       <SortedDescendingCellStyle BackColor="#FFFDF8" /> 
       <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> 
      </asp:GridView> 
      <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
       ConnectionString="<%$ ConnectionStrings:con %>" 
       ProviderName="<%$ ConnectionStrings:con.ProviderName %>" 
       SelectCommand="SELECT * FROM [View_Intakesheet]" 
       UpdateCommand="UPDATE intakesheet SET case_number = @case_number, [email protected]_name, [email protected]_type, Case_Status = @case_status, assigned_date = @assigned_date, assigned_to = @assigned_to, date_withdrawn= @date_withdrawn, date_delivered= @date_delivered, qc_by = @qc_by, [email protected]_date, additional_notes = @additional_notes WHERE (case_number = @case_number)"> 
       <UpdateParameters> 
        <asp:Parameter Name="case_number"/> 
        <asp:Parameter Name="case_name" /> 
        <asp:Parameter Name="case_type" /> 
        <asp:Parameter Name="case_status" /> 
        <asp:Parameter Name="assigned_date" Type="DateTime" /> 
        <asp:Parameter Name="assigned_to" /> 
        <asp:Parameter Name="date_withdrawn" Type="DateTime" /> 
        <asp:Parameter Name="date_delivered" Type="DateTime" /> 
        <asp:Parameter Name="qc_by" /> 
        <asp:Parameter Name="qc_date" Type="DateTime" /> 
        <asp:Parameter Name="additional_notes" /> 
       </UpdateParameters> 
      </asp:SqlDataSource> 
     </td> 
    </tr> 

以下是更新事件::

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 

    GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex]; 
    DropDownList ct = (DropDownList)row.FindControl("case_type"); 
    DropDownList cs = (DropDownList)row.FindControl("case_status"); 

    con.Open(); 
    SqlCommand cmd = new SqlCommand("UPDATE intakesheet SET case_number = @case_number, case_name = @case_name, Case_Type = Case_Type, Case_Status = Case_Status, assigned_date = assigned_date, assigned_to = assigned_to, date_withdrawn= date_withdrawn, date_delivered= date_delivered, qc_by = qc_by, qc_date=qc_date, additional_notes = additional_notes WHERE (case_number = case_number)", immigration); 

    cmd.ExecuteNonQuery(); 
    GridView1.EditIndex = -1; 
    con.Close(); 

    bind(); 

} 

public void bind() 
{ 

    con.Open(); 
    SqlDataAdapter da = new SqlDataAdapter("select * from intakesheet", con); 
    DataSet ds = new DataSet(); 
    da.Fill(ds, "intakesheet"); 
    //GridView1.DataSource = ds.Tables[0].DefaultView; 
    GridView1.DataBind(); 
    con.Close(); 

} 

回答

1
SqlCommand cmd = new SqlCommand("UPDATE intakesheet SET case_number = @case_number, case_name = @case_name, Case_Type = Case_Type, Case_Status = Case_Status, assigned_date = assigned_date, assigned_to = assigned_to, date_withdrawn= date_withdrawn, date_delivered= date_delivered, qc_by = qc_by, qc_date=qc_date, additional_notes = additional_notes WHERE (case_number = case_number)", immigration); 

改變這一行

主要問題,這些

Case_Type = Case_Type, Case_Status = Case_Status,in update query

DropDownList ct = (DropDownList)row.FindControl("case_type"); 
    DropDownList cs = (DropDownList)row.FindControl("case_status") 

;

發送ct.SelectedIndex.value如果想如果你有綁定與它的價值

,如果你想發送所選指數 然後 發送 dt.SelectedText

Case_Type = ct.SelectedItem.Text, Case_Status = cs.SelectedItem.Text 
發送IDS

檢查這條線

DropDownList cs = (DropDownList)row.FindControl("DropDownList3") 

與之相似給出正確的ID爲在要傳遞下拉的ID,就發送其所選索引中的任其選擇的值

改變

的SqlCommand CMD =新的SqlCommand上面的行的情況下類型

(「UPDATE intakesheet SET case_number = @case_number,case_name = @case_name,Case_Type = Case_Type,Case_Status = Case_Status,assigned_date = assigned_date,assigned_to = assigned_to,date_withdrawn = date_withdrawn,date_delivered = date_delivered,qc_by = qc_by,qc_date = qc_date,additional_notes = additional_notes WHERE(case_number = case_number)「,移民局);

cmd.parameters.add("@case_number",sqldbtype.nvarchar).value = case_number // the string variable of case number 

做類似的其他參數

+0

你能告訴我我該怎麼做? – CodeXerox

+0

這可以嗎.. string CaseType = ct.SelectedValue; string CaseStatus = cs.SelectedValue; – CodeXerox

+0

我收到ERROR ::對象引用未設置爲對象的實例:: on line :: string CaseType = ct.SelectedValue; – CodeXerox

0

我也有一個問題,這是不更新一個GridView。在GridView的RowUpdating事件中檢查e.Newvalues字典顯示記錄的舊值被髮送到數據庫UPDATE查詢。 DataKeyNames不是我的問題;我把它設置正確。我的SELECT查詢的WHERE子句在我的表單上引用了一個TextBox的控件參數。我無意中將此文本框的EnableViewState設置爲「False」。正因爲如此,GridView在UPDATE發生之前重新綁定了自己。將TextBox上的EnableViewState設置爲「True」可解決問題。這裏是代碼看到更新參數:

Protected Sub MyGridView_RowUpdating _ 
    (sender As Object, e As System.Web.UI.WebControls.GridViewUpdateEventArgs) _ 
    Handles MyGridView.RowUpdating 

    ' Inspect the parameters being sent to the database for an ASP NET GridView UPDATE. 

    Dim I As Integer 

    I = 0 

    For Each MVO As System.Collections.DictionaryEntry In e.OldValues 
     If MVO.Value Is DBNull.Value OrElse MVO.Value Is Nothing Then 
      Debug.Print(I.ToString + ": " + MVO.Key + " Value: ") 
     Else 
      Debug.Print(I.ToString + ": " + MVO.Key + " Value: " + MVO.Value.ToString) 
     End If 

     I += 1 
    Next MVO 

    I = 0 
    For Each MVN As System.Collections.DictionaryEntry In e.NewValues 
     If MVN.Value Is DBNull.Value OrElse MVN.Value Is Nothing Then 
      Debug.Print(I.ToString + ": " + MVN.Key + " Value: ") 
     Else 
      Debug.Print(I.ToString + ": " + MVN.Key + " Value: " + MVN.Value.ToString) 
     End If 
     I += 1 
    Next MVN 


End Sub