You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除图书列表项遇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;
}

总结一下改动点

  1. 用Int32.TryParse替代Int32.Parse,彻底解决格式异常问题
  2. 修正删除后修改已删除对象的无效逻辑
  3. 通过检查catalogueInstance.books.Count == 0来显示空目录提示
  4. 删除后重新绑定下拉列表,确保界面与数据同步
  5. 新增清空文本框的辅助方法,优化用户体验

内容的提问来源于stack exchange,提问作者Strato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:56:47