删除图书列表项遇FormatException未处理,需实现空目录提示
解决图书删除功能的两个问题:FormatException 报错与空目录提示
我来帮你搞定这两个问题——首先是Int32.Parse抛出的格式异常,然后是删除完所有图书后正确显示空目录提示的需求。
一、解决 FormatException 错误
你遇到的这个异常,是因为Int32.Parse在处理非有效整数字符串(比如空文本、字母、符号)时会直接抛出异常。要安全处理这种情况,应该用Int32.TryParse方法,它会返回一个布尔值表示解析是否成功,不会直接崩溃。
替换你原来的int id = Int32.Parse(txtID.Text);代码段,改成下面的安全解析逻辑:
int id; // 尝试解析ID,失败则给出提示并终止操作 if (!Int32.TryParse(txtID.Text, out id)) { txtSummary.Text = "无效的图书ID,请先从下拉列表选择要删除的图书。"; return; }
这个改动的好处是:
- 避免了格式异常的抛出
- 能明确提示用户输入问题
- 解析成功后,
id变量会自动获得正确的整数值
二、完善空目录提示逻辑
你当前的try/catch是在捕获文件不存在的异常,但实际上就算删完所有图书,JSON文件依然存在,只是里面的books列表为空。所以正确的判断逻辑应该是检查内存中的图书列表是否为空,而不是抓文件异常。
另外,你原代码里还有个逻辑错误:删除图书后还在修改已删除的book对象,这完全没必要(因为它已经不在列表里了)。我帮你重构了整个btnDelete_Click方法,修正逻辑并实现空目录提示:
protected void btnDelete_Click(object sender, EventArgs e) { // 1. 安全解析ID,避免格式异常 int id; if (!Int32.TryParse(txtID.Text, out id)) { txtSummary.Text = "无效的图书ID,请先从下拉列表选择要删除的图书。"; return; } // 2. 验证选中的索引是否有效 int selectedIndex = ddlDelete.SelectedIndex; if (selectedIndex < 0 || selectedIndex >= catalogueInstance.books.Count) { txtSummary.Text = "未选中有效的待删除图书。"; return; } // 3. 执行删除操作 catalogueInstance.books.RemoveAt(selectedIndex); // 4. 保存更新后的目录到JSON文件 string jsonText = JsonConvert.SerializeObject(catalogueInstance); File.WriteAllText(FILENAME, jsonText); // 5. 更新界面:重新绑定下拉列表,清空文本框 ddlDelete.DataSource = catalogueInstance.books; ddlDelete.DataBind(); ClearTextBoxes(); // 6. 判断是否还有剩余图书,显示对应提示 if (catalogueInstance.books.Count == 0) { txtSummary.Text = "There are no items left in the catalogue"; btnDelete.Enabled = false; // 可选:禁用删除按钮,避免无效操作 } else { txtSummary.Text = $"Book ID {id} has been deleted from the Catalogue"; // 如果还有图书,默认选中第一个并填充信息 if (ddlDelete.Items.Count > 0) { ddlDelete.SelectedIndex = 0; ddlDelete_SelectedIndexChanged(ddlDelete, new EventArgs()); } } } // 新增辅助方法:清空所有文本框 private void ClearTextBoxes() { txtID.Text = string.Empty; txtTitle.Text = string.Empty; txtAuthor.Text = string.Empty; txtYear.Text = string.Empty; txtPublisher.Text = string.Empty; txtISBN.Text = string.Empty; }
同时,为了避免删除最后一本图书后触发下拉框索引越界错误,建议修改ddlDelete_SelectedIndexChanged方法:
protected void ddlDelete_SelectedIndexChanged(object sender, EventArgs e) { // 如果图书列表为空,直接清空文本框 if (catalogueInstance.books.Count == 0) { ClearTextBoxes(); return; } Book b = catalogueInstance.books[ddlDelete.SelectedIndex]; txtID.Text = b.id.ToString(); txtTitle.Text = b.title; txtAuthor.Text = b.author; txtYear.Text = b.year.ToString(); txtPublisher.Text = b.publisher; txtISBN.Text = b.isbn; }
总结一下改动点
- 用
Int32.TryParse替代Int32.Parse,彻底解决格式异常问题 - 修正删除后修改已删除对象的无效逻辑
- 通过检查
catalogueInstance.books.Count == 0来显示空目录提示 - 删除后重新绑定下拉列表,确保界面与数据同步
- 新增清空文本框的辅助方法,优化用户体验
内容的提问来源于stack exchange,提问作者Strato
相关产品推荐
相关产品推荐

