[英]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.