簡體   English   中英

為什么在嘗試使用復選框編輯此字段時出現錯誤?

[英]Why I am getting an error when trying to edit this field using checkbox?

我是新的C#和ASP.NET開發人員。 我正在開發一個簡單的事件管理系統。 我希望管理員能夠編輯事件的信息。 這些事件將在GridView中列出,該GridView綁定到數據庫中的下表:

Events Table: ID, Title, Description, Location, NumberOfSeats, StartDateTime, EndDateTime, IsActive

(IsActive表示活動事件或非活動事件)

一切正常,除了當我嘗試編輯IsActive字段時,它給了我以下錯誤:

輸入的字符串格式不正確。

由於以下代碼行:

int ID = Convert.ToInt32(gvrow.Cells[0].Text);

您能幫我解決這個問題嗎?

ASP.NET代碼:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID"
            width="500px" DataSourceID="SqlDataSource1" OnRowDataBound="GridView1_RowDataBound">
            <Columns>
                <asp:CommandField ButtonType="Image" ShowEditButton="true" ShowCancelButton="true"
                                EditImageUrl="Images/icons/edit24.png" UpdateImageUrl="Images/icons/update24.png" 
                                CancelImageUrl="Images/icons/cancel324.png" />

                <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" Visible="false" />

                <asp:TemplateField HeaderText="Title">
                    <ItemTemplate>
                        <%# Eval("Title") %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtTitle"  runat="server" 
                                        Text='<%# Bind("Title") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Description">
                    <ItemTemplate>
                        <%# Eval("Description") %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtDescription" TextMode="MultiLine"  Rows="4" cols="30"
                            runat="server" Text='<%# Bind("Description") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Location">
                    <ItemTemplate>
                        <%# Eval("Location") %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtLocation" runat="server"
                                        Text='<%# Bind("Location") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Number of Seats">
                    <ItemTemplate>
                        <%# Eval("NumberOfSeats") %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="txtNumberOfSeats"  runat="server"
                                        Text='<%# Bind("NumberOfSeats") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Start Date & Time">
                    <ItemTemplate>
                        <%# Eval("StartDateTime")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="start_DateTime"  runat="server"
                                        Text='<%# Bind("StartDateTime") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>


                <asp:TemplateField HeaderText="End Date & Time">
                    <ItemTemplate>
                        <%# Eval("EndDateTime")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="end_DateTime" runat="server"
                                        Text='<%# Bind("EndDateTime") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>


                <asp:TemplateField HeaderText="Is Active?">
                    <ItemTemplate>
                        <asp:Label ID="lblIsActive" runat="server" Text='<%# Eval("IsActive") %>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:CheckBox ID="isActive" runat="server" AutoPostBack="true"
                                        OnCheckedChanged="isActive_OnCheckedChanged" 
                                        Checked='<%# Convert.ToBoolean(Eval("IsActive")) %>' />
                    </EditItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Delete?">
                    <ItemTemplate>
                        <span onclick="return confirm('Are you sure to Delete the record?')">
                            <asp:ImageButton ID="lnkB" runat="server" ImageUrl="Images/icons/delete24.png" CommandName="Delete" />
                        </span>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:PM_RegistrationSysDBConnectionString %>" 
            SelectCommand="SELECT ID, Title, Description, Location, StartDateTime, EndDateTime, 
                            NumberOfSeats, IsActive 
                            FROM Events 
                            WHERE (IsActive = 1) 
                            ORDER BY ID DESC"
            UpdateCommand="UPDATE [Events] SET [Title] = @Title, [Description] = @Description, 
                                                [Location] = @Location, [NumberOfSeats] = @NumberOfSeats, 
                                                [StartDateTime]= @StartDateTime, [EndDateTime] = @EndDateTime
                                                WHERE [ID] = @ID"
            DeleteCommand="DELETE FROM [Events] WHERE [ID] = @ID">
            <UpdateParameters>
                <asp:Parameter Name="Title" Type="String" />
                <asp:Parameter Name="Description" Type="String" />
                <asp:Parameter Name="Location" Type="String" />
                <asp:Parameter Name="NumberOfSeats" Type="Int32" />
                <asp:Parameter Name="StartDateTime" Type="DateTime" />
                <asp:Parameter Name="EndDateTime" Type="DateTime" />
            </UpdateParameters>
            <DeleteParameters>
                <asp:Parameter Name="ID" Type="Int32" />
            </DeleteParameters>
        </asp:SqlDataSource>

C#代碼:

 //for updating the (IsActive) column using checkbox inside the GridView
    protected void isActive_OnCheckedChanged(object sender, EventArgs e)
    {
        CheckBox chkStatus = (CheckBox)sender;
        GridViewRow gvrow = (GridViewRow)chkStatus.NamingContainer;

        //Get the ID which is the ID of the Event
        int ID = Convert.ToInt32(gvrow.Cells[0].Text);
        bool status = chkStatus.Checked;


        string connString = ConfigurationManager.ConnectionStrings["PM_RegistrationSysDBConnectionString"].ConnectionString;
        SqlConnection conn = new SqlConnection(connString);

        string updateIsActive = "UPDATE Events SET IsActive = @IsActive WHERE ID = @ID";

        SqlCommand cmd = new SqlCommand(updateIsActive, conn);

        cmd.Parameters.AddWithValue("@IsActive", status);
        cmd.Parameters.AddWithValue("@ID", ID);

        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }
        catch (SqlException se)
        {
            throw se;
        }
        finally
        {
            cmd.Dispose();
            conn.Close();
            conn.Dispose();
        }

        //this is checkbox is unchecked then set backcolor to Gray
        if (!status)
        {
            gvrow.BackColor = Color.Black;
        }
    }

gvrow.Cells[0]將引用您的按鈕。

它沒有引用您的ID。

您已在第二欄中輸入了id。

訪問代碼應該像

gvrow.Cells[1]

最好添加標簽並使它顯示為false,將ID綁定到它,並使用FindControl方法查找控件,然后將其強制轉換為Label並訪問標簽的Text屬性。

  <asp:TemplateField HeaderText="Title">
       <ItemTemplate>
          <%# Eval("Title") %>

           <asp:Label ID="lblID"  runat="server" Visible="false" 
              Text='<%# Bind("ID") %>'></asp:Label>
        </ItemTemplate>
     <EditItemTemplate>
         <asp:TextBox ID="txtTitle"  runat="server" Text='<%# Bind("Title") %>'>         </asp:TextBox>

     </EditItemTemplate>
  </asp:TemplateField>

並在后面的代碼中。

Label lblID = (Label)gvrow.FindControl("lblID");
int ID = Convert.ToInt32(lblID.Text); 

然后使用此ID更新狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM