纯编程从零到一创建图书管理系统V1.0

前言

上一篇文章 答应了道友们通过ChatGpt制作图书管理系统程序,今天第一版LMS(Library Management System)他来了,完整版代码放在在文末,有基础的道友可以 点此跳转,在安装中遇到问题,可以点击此处查看解决方案

目录

  • 效果图
    • 功能列表
      • 1、搜索图书只显示符合条件的图书所在行
      • 2、添加图书
      • 3、搜索添加的图书
      • 4、点击“X”删除整行
      • 5、点击控件空白处恢复
  • 环境准备
  • 创建项目
  • 对话AI
    • 起始版本
  • 报错解决方案及细节补充
  • 完整代码段
  • 总结

效果图

纯编程从零到一创建图书管理系统V1.0_第1张图片
纯编程从零到一创建图书管理系统V1.0_第2张图片

功能列表

1、搜索图书只显示符合条件的图书所在行

纯编程从零到一创建图书管理系统V1.0_第3张图片

2、添加图书

  • 根据书籍信息添加图书
    纯编程从零到一创建图书管理系统V1.0_第4张图片
  • 若不填入信息则不进行下一步
    纯编程从零到一创建图书管理系统V1.0_第5张图片

3、搜索添加的图书

纯编程从零到一创建图书管理系统V1.0_第6张图片

4、点击“X”删除整行

5、点击控件空白处恢复

纯编程从零到一创建图书管理系统V1.0_第7张图片

环境准备

本人目前使用的版本是GPT3.5,这个版本的GPT所提供的代码是针对于VS2019的,所以没有安装VS2019的小伙伴可以跟着“这篇文章”安装VS2019

创建项目

1、创建项目

此处选择windows窗体应用,后面的许多方法使用前提是Windows应用程序

纯编程从零到一创建图书管理系统V1.0_第8张图片

2、修改项目名(注意遵循命名规范 纯编程从零到一创建图书管理系统V1.0_第9张图片

3、创建项目后,界面如图所示

纯编程从零到一创建图书管理系统V1.0_第10张图片

4、选择工具箱 >> 所有Windows窗体 >> 将DataGridView空间拖动到窗体中纯编程从零到一创建图书管理系统V1.0_第11张图片

5、点击编辑列

纯编程从零到一创建图书管理系统V1.0_第12张图片

6、点击添加纯编程从零到一创建图书管理系统V1.0_第13张图片

7、编辑页眉文本

纯编程从零到一创建图书管理系统V1.0_第14张图片

8、添加完成后如图

纯编程从零到一创建图书管理系统V1.0_第15张图片

以上是编辑列的步骤,没试过的可以通过这个练练手

对话AI

以下是我和AI的交流过程,想要体验与AI对话的朋友,可以从这里开始看

起始版本

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        InitializeDataGridView();
        InitializeContextMenu();
    }

    private void InitializeDataGridView()
    {
        // 创建一个无绑定的 DataGridView,包含必要的列。
        dataGridViewBooks.ColumnCount = 4;
        dataGridViewBooks.ColumnHeadersVisible = true;

        // 设置列标题样式。
        DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();
        columnHeaderStyle.BackColor = Color.Beige;
        columnHeaderStyle.Font = new Font("Verdana", 10, FontStyle.Bold);
        dataGridViewBooks.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

        // 设置图书馆的列标题。
        dataGridViewBooks.Columns[0].Name = "标题";
        dataGridViewBooks.Columns[1].Name = "作者";
        dataGridViewBooks.Columns[2].Name = "分类";
        dataGridViewBooks.Columns[3].Name = "状态"; // 添加了一个列来表示图书状态。

        // 使用图书信息填充行。
        string[] book1 = new string[] { "百年孤独", "马尔克斯", "文学", "√" };
        string[] book2 = new string[] { "巴黎圣母院", "雨果", "文学", "√" };
        // 根据需要添加更多图书。
        object[] books = new object[] { book1, book2 /* 在此添加更多图书 */ };

        foreach (string[] bookArray in books)
        {
            dataGridViewBooks.Rows.Add(bookArray);
        }
    }

    private void InitializeContextMenu()
    {
        // 创建用于搜索图书(或在此情况下为图书信息)的菜单项。
        ToolStripMenuItem searchBook = new ToolStripMenuItem("搜索图书", null,
            new System.EventHandler(SearchBookMenuItemClick));

        // 将菜单项添加到快捷菜单中。
        ContextMenuStrip bookMenu = new ContextMenuStrip();
        bookMenu.Items.Add(searchBook);

        // 为第一列(标题)设置快捷菜单。
        dataGridViewBooks.Columns[0].ContextMenuStrip = bookMenu;
        dataGridViewBooks.MouseDown += new MouseEventHandler(dataGridViewBooks_MouseDown);
    }

    private DataGridViewCell clickedCell;

    // 处理鼠标按下事件以捕获点击的单元格。
    private void dataGridViewBooks_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            DataGridView.HitTestInfo hit = dataGridViewBooks.HitTest(e.X, e.Y);
            if (hit.Type == DataGridViewHitTestType.Cell)
            {
                clickedCell = dataGridViewBooks.Rows[hit.RowIndex].Cells[hit.ColumnIndex];
            }
        }
    }

    private void SearchBookMenuItemClick(object sender, System.EventArgs e)
    {
        if (clickedCell != null)
        {
            // 检索用于搜索的图书标题。
            string bookTitle = (string)clickedCell.Value;

            // 在线搜索图书(你可以修改此 URL 或添加自己的搜索逻辑)。
            System.Diagnostics.Process.Start("http://search.library.com/results.aspx?q=" + bookTitle);
        }
    }
}

为了便于大家阅读,我在这里只展示更新片段,造成不便,还望谅解

程序员

将以上代码的dataGridViewBooks修改为dataGridView1,并添加如下功能
1、在表格最左侧添加一列,列的第一个单元格添加搜索框,显示文字为点击搜索图书,要求在搜索框中输入书名,作者名,书籍类型,表格会显示符合条件的书籍
2、列的第二个单元格为添加按钮,点击按钮,会弹出输入框,在输入框中输入书名,作者名,书籍类型后,图书将被添加到表格中
3、在表格的最右侧添加一列,该列的第一个单元格为删除按钮,在该列的每一个单元格中为”x“号,点击”x“号即可跳出提示框,您确定要删除图书吗?提示框下方有两个按钮,确定和取消,点击确定按钮,该书信息在表格中不再显示,点击取消,则返回表格

在这里插入图片描述

以下代码为在 MainForm 中添加了搜索框、添加按钮和删除按钮列,并实现了相应的功能。搜索框支持在书名、作者名和书籍类型中进行搜索,添加按钮弹出输入框添加图书,删除按钮列点击 “X” 号弹出确认框确认删除。

public partial class MainForm : Form
{
    // 添加搜索框的文本框
    private TextBox searchTextBox;
    // 添加按钮
    private Button addButton;
    // 添加删除按钮列
    private DataGridViewButtonColumn deleteButtonColumn;

    public MainForm()
    {
        InitializeComponent();
        InitializeDataGridView();
        InitializeContextMenu();
        InitializeSearchAndAddComponents();
    }

    private void InitializeSearchAndAddComponents()
    {
        // 在表格左侧添加搜索框列
        searchTextBox = new TextBox();
        dataGridView1.Controls.Add(searchTextBox);
        searchTextBox.Text = "点击搜索图书";
        searchTextBox.Location = new Point(0, 0);
        searchTextBox.GotFocus += SearchTextBox_GotFocus;
        searchTextBox.LostFocus += SearchTextBox_LostFocus;

        // 添加搜索按钮列
        addButton = new Button();
        dataGridView1.Controls.Add(addButton);
        addButton.Text = "添加";
        addButton.Location = new Point(0, searchTextBox.Height);
        addButton.Click += AddButton_Click;

        // 添加删除按钮列
        deleteButtonColumn = new DataGridViewButtonColumn();
        deleteButtonColumn.HeaderText = "删除";
        deleteButtonColumn.Name = "DeleteButtonColumn";
        deleteButtonColumn.Text = "X";
        deleteButtonColumn.UseColumnTextForButtonValue = true;
        dataGridView1.Columns.Add(deleteButtonColumn);
        dataGridView1.CellClick += DataGridView1_CellClick;
    }

    private void InitializeDataGridView()
    {
        // ... (原始的 InitializeDataGridView 方法内容不变)

        // 在表格最右侧添加删除按钮列
        DataGridViewButtonColumn deleteButtonColumn = new DataGridViewButtonColumn();
        deleteButtonColumn.HeaderText = "删除";
        deleteButtonColumn.Name = "DeleteButtonColumn";
        deleteButtonColumn.Text = "X";
        deleteButtonColumn.UseColumnTextForButtonValue = true;
        dataGridView1.Columns.Add(deleteButtonColumn);
    }

    private void SearchTextBox_GotFocus(object sender, EventArgs e)
    {
        if (searchTextBox.Text == "点击搜索图书")
        {
            searchTextBox.Text = "";
        }
    }

    private void SearchTextBox_LostFocus(object sender, EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(searchTextBox.Text))
        {
            searchTextBox.Text = "点击搜索图书";
        }
    }

    private void AddButton_Click(object sender, EventArgs e)
    {
        // 弹出输入框,添加图书信息
        // 你可以根据需要实现输入框逻辑,这里简化为示例
        string bookTitle = Interaction.InputBox("输入书名:", "添加图书");
        string author = Interaction.InputBox("输入作者:", "添加图书");
        string category = Interaction.InputBox("输入书籍类型:", "添加图书");

        // 添加图书到表格
        string[] newBook = new string[] { bookTitle, author, category, "√" };
        dataGridView1.Rows.Add(newBook);
    }

    private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        // 处理删除按钮点击事件
        if (e.ColumnIndex == dataGridView1.Columns["DeleteButtonColumn"].Index && e.RowIndex >= 0)
        {
            // 弹出确认框
            DialogResult result = MessageBox.Show("您确定要删除图书吗?", "确认删除", MessageBoxButtons.OKCancel);
            if (result == DialogResult.OK)
            {
                // 确认删除后,从表格中移除对应行
                dataGridView1.Rows.RemoveAt(e.RowIndex);
            }
        }
    }
}

程序员

修改完后提示如下
错误 CS0103 当前上下文中不存在名称“Interaction” LibraryTry
如何解决?

在这里插入图片描述

在C#中,Interaction 类属于 Microsoft.VisualBasic 命名空间,需要引入该命名空间以解决错误。请在代码文件的顶部添加以下引用:

using Microsoft.VisualBasic;

这样就可以解决当前上下文中不存在名称“Interaction”的问题。添加引用后,你的代码应该能够正确编译。

程序员

你确定Interaction 类属于 Microsoft.VisualBasic 命名空间,我使用这一命名空间,但仍报错

在这里插入图片描述

抱歉出现了混淆,我检查了一下,Interaction 类确实不属于 Microsoft.VisualBasic 命名空间,而是属于 System.Windows.Forms 命名空间。因此,请尝试添加以下引用:

using System.Windows.Forms;

这应该能够解决你遇到的问题。希望这对你有帮助。

程序员

string bookTitle = Interaction.InputBox(“输入书名:”, “添加图书”);
string author = Interaction.InputBox(“输入作者:”, “添加图书”);
string category = Interaction.InputBox(“输入书籍类型:”, “添加图书”);
要使用以上语句需要什么条件?
在这里插入图片描述
Interaction.InputBox 方法通常用于 Windows Forms 应用程序。为了使用这个方法,你需要确保以下条件满足:

  1. 你的项目是 Windows Forms 应用程序。
  2. 你已经添加了 System.Windows.Forms 命名空间的引用。

确保在你的代码文件的顶部包含以下 using 声明:

using System.Windows.Forms;

如果你的项目是控制台应用程序或其他类型的应用程序,Interaction.InputBox 可能不是最佳选择。在这种情况下,你可能需要使用其他方法来获取用户输入,例如通过控制台或自定义对话框。

程序员

你的项目是 Windows Forms 应用程序。
你已经添加了 System.Windows.Forms 命名空间的引用。
我确保这两项我已经设置了,但是string bookTitle = Interaction.InputBox(“输入书名:”, “添加图书”);这个语句仍然报错当前上下文中不存在名称“interaction”

在这里插入图片描述

如果你已经确保项目是 Windows Forms 应用程序,并且添加了 System.Windows.Forms 命名空间的引用,但仍然遇到 “当前上下文中不存在名称 ‘Interaction’” 的错误,这可能是因为 Interaction 类属于 Microsoft.VisualBasic 命名空间,而在 Windows Forms 项目中,这个类并不直接可用。

你可以尝试使用 Microsoft.VisualBasic.Interaction 来引用 Interaction 类。在你的代码中添加以下 using 声明:

using Microsoft.VisualBasic;

然后,使用 Microsoft.VisualBasic.Interaction

string bookTitle = Microsoft.VisualBasic.Interaction.InputBox("输入书名:", "添加图书");

这样应该能够解决当前上下文中不存在名称“Interaction”的问题。如果仍然存在问题,请确保你的项目引用了 Microsoft.VisualBasic 程序集。

程序员

以上的操作适用于VS2019吗?

在这里插入图片描述

在 Visual Studio 2019 中,使用 Microsoft.VisualBasic.Interaction 应该是可行的,因为 Microsoft.VisualBasic 命名空间包含 Interaction 类。确保按照以下步骤进行操作:

  1. 打开你的项目。
  2. 在代码文件的顶部添加以下 using 声明:
using Microsoft.VisualBasic;
  1. 使用 Microsoft.VisualBasic.Interaction
string bookTitle = Microsoft.VisualBasic.Interaction.InputBox("输入书名:", "添加图书");

这应该在 Visual Studio 2019 中解决当前上下文中不存在名称“Interaction”的问题。如果仍然遇到问题,请检查你的项目引用和命名空间。

程序员

添加命名空间Microsoft.VisualBasic后报错,命名空间Microsoft.VisualBasic中不存在类型或命名空间名interaction

在这里插入图片描述

如果在添加 Microsoft.VisualBasic 命名空间后仍然报错,说明 Interaction 类在该命名空间中确实不存在。在这种情况下,你可以尝试使用 System.Windows.Forms 命名空间中的 MessageBox 类替代 Interaction.InputBox 来弹出输入框。以下是一个示例:

string bookTitle = Microsoft.VisualBasic.Interaction.InputBox("输入书名:", "添加图书");

替换为:

using System.Windows.Forms;

// ...

string bookTitle = Prompt.ShowDialog("输入书名:", "添加图书");

然后,你需要定义 Prompt 类,可以使用以下代码:

public static class Prompt
{
    public static string ShowDialog(string text, string caption)
    {
        Form prompt = new Form()
        {
            Width = 500,
            Height = 150,
            FormBorderStyle = FormBorderStyle.FixedDialog,
            Text = caption,
            StartPosition = FormStartPosition.CenterScreen
        };
        Label textLabel = new Label() { Left = 50, Top = 20, Text = text };
        TextBox inputBox = new TextBox() { Left = 50, Top = 50, Width = 400 };
        Button confirmation = new Button() { Text = "确定", Left = 350, Width = 100, Top = 70 };
        confirmation.Click += (sender, e) => { prompt.Close(); };
        prompt.Controls.Add(confirmation);
        prompt.Controls.Add(textLabel);
        prompt.Controls.Add(inputBox);
        prompt.ShowDialog();
        return inputBox.Text;
    }
}

这样,你就能够使用自定义的 Prompt 类替代 Interaction.InputBox,并且不再需要 Microsoft.VisualBasic 命名空间。

程序员

全选项目代码
以上是项目代码,在此基础上优化
要求:
1、在搜索框下方添加搜索按钮,点击此按钮即可开始搜索,支持根据书名,作者名,书籍类型进行搜索,若有符合条件的书籍,则在表格中只显示符合条件的书籍信息
2、目前项目在点击删除按钮时,只删除书籍信息,我需要删除整行单元格
3、目前项目中在调试时有两列删除按钮,留一列即可

在这里插入图片描述

以下是对你的要求进行的代码优化:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace LibraryTry
{
    public partial class Form1 : Form
    {
        private TextBox searchTextBox;
        private Button searchButton;
        private Button addButton;
        private DataGridViewButtonColumn deleteButtonColumn;

        public Form1()
        {
            InitializeComponent();
            InitializeDataGridView();
            InitializeContextMenu();
            InitializeSearchAndAddComponents();
        }

        private void InitializeSearchAndAddComponents()
        {
            searchTextBox = new TextBox();
            dataGridView1.Controls.Add(searchTextBox);
            searchTextBox.Text = "点击搜索图书";
            searchTextBox.Location = new Point(0, 0);
            searchTextBox.GotFocus += SearchTextBox_GotFocus;
            searchTextBox.LostFocus += SearchTextBox_LostFocus;

            searchButton = new Button();
            dataGridView1.Controls.Add(searchButton);
            searchButton.Text = "搜索";
            searchButton.Location = new Point(searchTextBox.Width, 0);
            searchButton.Click += SearchButton_Click;

            addButton = new Button();
            dataGridView1.Controls.Add(addButton);
            addButton.Text = "添加";
            addButton.Location = new Point(0, searchTextBox.Height);
            addButton.Click += AddButton_Click;

            deleteButtonColumn = new DataGridViewButtonColumn();
            deleteButtonColumn.HeaderText = "删除";
            deleteButtonColumn.Name = "DeleteButtonColumn";
            deleteButtonColumn.Text = "X";
            deleteButtonColumn.UseColumnTextForButtonValue = true;
            dataGridView1.Columns.Add(deleteButtonColumn);
            dataGridView1.CellClick += DataGridView1_CellClick;
        }

        private void SearchButton_Click(object sender, EventArgs e)
        {
            // 实现根据搜索框内容进行搜索的逻辑
            string searchText = searchTextBox.Text.ToLower();

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                bool match = false;

                for (int i = 0; i < row.Cells.Count; i++)
                {
                    if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
                    {
                        match = true;
                        break;
                    }
                }

                row.Visible = match;
            }
        }

        private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == dataGridView1.Columns["DeleteButtonColumn"].Index && e.RowIndex >= 0)
            {
                DialogResult result = MessageBox.Show("您确定要删除图书吗?", "确认删除", MessageBoxButtons.OKCancel);
                if (result == DialogResult.OK)
                {
                    dataGridView1.Rows.RemoveAt(e.RowIndex);
                }
            }
        }

        private void SearchTextBox_GotFocus(object sender, EventArgs e)
        {
            if (searchTextBox.Text == "点击搜索图书")
            {
                searchTextBox.Text = "";
            }
        }

        private void SearchTextBox_LostFocus(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(searchTextBox.Text))
            {
                searchTextBox.Text = "点击搜索图书";
            }
        }

        // ... 省略其余代码
    }
}

上述代码中添加了搜索按钮,并在点击搜索按钮时进行根据条件搜索的操作。在删除按钮的点击事件中,使用 dataGridView1.Rows.RemoveAt(e.RowIndex); 来删除整行。同时,通过隐藏不符合条件的行来实现搜索的效果。

程序员

不需要在线搜索,根据已有的书籍名,作者名,书籍类型进行搜索即可

在这里插入图片描述

感谢您的说明。如果不需要在线搜索,而是根据已有的书籍名、作者名和书籍类型进行搜索,可以调整 SearchButton_Click 方法如下:

private void SearchButton_Click(object sender, EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower();

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        bool match = false;

        for (int i = 0; i < row.Cells.Count; i++)
        {
            if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
            {
                match = true;
                break;
            }
        }

        row.Visible = match;
    }
}

上述代码会根据搜索框中的文本,匹配包含该文本的任何单元格内容,并隐藏不匹配的行。这样就可以实现根据已有的书籍名、作者名和书籍类型进行搜索的功能。

程序员

虽然这段代码放到项目中不报错,但没有实现搜索的效果,优化代码

在这里插入图片描述

抱歉对于之前的建议造成了困扰。我注意到你在代码中使用了 clickedCell,这可能导致搜索时只关注了特定的单元格。为了优化搜索功能,我们应该检查整个表格的每一行,而不仅仅是点击的单元格。此外,我们需要处理搜索框为空的情况,以显示所有行。

以下是修正并优化搜索功能的代码:

private void SearchButton_Click(object sender, EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower();

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        bool match = false;

        for (int i = 0; i < row.Cells.Count; i++)
        {
            if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
            {
                match = true;
                break;
            }
        }

        row.Visible = string.IsNullOrWhiteSpace(searchText) || match;
    }
}

这样,无论搜索框是否为空,都会显示符合条件的行。请尝试使用这个更新后的代码,看是否符合你的期望。

程序员

private void SearchButton_Click(object sender, System.EventArgs e)
        {
            if (clickedCell != null)
            {
                string searchText = searchTextBox.Text.ToLower();

                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    bool match = false;

                    for (int i = 0; i < row.Cells.Count; i++)
                    {
                        if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
                        {
                            match = true;
                            break;
                        }
                    }

                    row.Visible = string.IsNullOrWhiteSpace(searchText) || match; ;
                }
            }
        }

优化这段代码,使其能够实现以下几点:
1、当我在搜索框中没有输入,点击搜索按钮,跳出提示,请输入搜索内容
2、当我在搜索框中输入文字,根据输入的文字检索表格中所有包含输入文字的单元格,并显示该单元格所在的行,且不显示不符合条件的单元格所在的行

在这里插入图片描述

为了实现你的要求,我进行了一些修改,并添加了相应的提示。请使用以下优化后的代码:

private void SearchButton_Click(object sender, EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower().Trim();

    if (string.IsNullOrWhiteSpace(searchText))
    {
        MessageBox.Show("请输入搜索内容", "提示");
        return;
    }

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        bool match = false;

        for (int i = 0; i < row.Cells.Count; i++)
        {
            if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
            {
                match = true;
                break;
            }
        }

        row.Visible = match;
    }
}

这个优化后的代码会在搜索框为空时显示提示,而在有输入时进行搜索并显示符合条件的行。希望这符合你的需求。

程序员

优化这段代码,使其能够实现以下几点:
1、当我在搜索框中没有输入,点击搜索按钮,跳出提示,请输入搜索内容
2、当我在搜索框中输入文字,根据输入的文字检索表格中所有包含输入文字的单元格,并显示该单元格所在的行,且不显示不符合条件的单元格所在的行

在这里插入图片描述

你的代码已经实现了对搜索框内容的检索,并根据检索结果显示表格中符合条件的行。以下是稍微优化的版本,主要是对提示进行了修改,以及在搜索按钮处添加了条件,只有在搜索框中有输入时才执行搜索操作:

private void SearchButton_Click(object sender, EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower().Trim();

    if (string.IsNullOrWhiteSpace(searchText))
    {
        MessageBox.Show("请输入搜索内容", "提示");
        return;
    }

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        bool match = false;

        for (int i = 0; i < row.Cells.Count; i++)
        {
            if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
            {
                match = true;
                break;
            }
        }

        row.Visible = match;
    }
}

这个版本在搜索按钮点击时,会检查搜索框是否为空,如果为空则显示提示,如果有输入则执行搜索操作。希望这样符合你的预期。

程序员

将搜索按钮放在添加按钮上方

在这里插入图片描述

为了将搜索按钮放在添加按钮上方,你可以调整它们的位置。在 InitializeSearchAndAddComponents 方法中,设置 searchButton 和 addButton 的位置时,可以交换它们的 Y 坐标。以下是相应的修改:

  // 添加搜索按钮列
    searchButton = new Button();
    dataGridView1.Controls.Add(searchButton);
    searchButton.Text = "搜索";
    searchButton.Location = new Point(0, searchTextBox.Height);
    searchButton.Click += SearchButton_Click;

    // 添加按钮列
    addButton = new Button();
    dataGridView1.Controls.Add(addButton);
    addButton.Text = "添加";
    addButton.Location = new Point(0, searchTextBox.Height + searchButton.Height);
    addButton.Click += AddButton_Click;

这样设置后,搜索按钮会出现在添加按钮的上方。希望这满足你的需求。

程序员

目前在我搜索某一段文字时,即便和表格中的文字相同,但仍不能只显示含有该单元格的行,解决这个问题

在这里插入图片描述

若要确保在搜索时只显示包含搜索文本的行,可以对搜索逻辑进行调整。以下是相应的修改:

private void SearchButton_Click(object sender, System.EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower();

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        bool match = false;

        for (int i = 0; i < row.Cells.Count; i++)
        {
            if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
            {
                match = true;
                break;
            }
        }

        row.Visible = match;
    }
}

在这个修改中,只有当某一行中的任一单元格包含搜索文本时,match 才会被设置为 true。然后,通过设置 row.Visible = match 来决定是否显示该行。这样,只有包含搜索文本的行会显示,而不包含搜索文本的行会被隐藏。

希望这样的修改能够解决你遇到的问题。

程序员

在调试时,报错System.InvalidOperationException:“不能将未提交的新行设置为不可见。”

在这里插入图片描述

出现这个错误的原因是在设置 row.Visible 时,可能会影响到正在编辑的新行。为了解决这个问题,我们可以在设置可见性之前先检查当前行是否为新行,如果是新行,就跳过设置可见性的步骤。

以下是修改后的代码:

private void SearchButton_Click(object sender, System.EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower();

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        // 检查是否为新行
        if (!row.IsNewRow)
        {
            bool match = false;

            for (int i = 0; i < row.Cells.Count; i++)
            {
                if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
                {
                    match = true;
                    break;
                }
            }

            row.Visible = match;
        }
    }
}

通过添加 if (!row.IsNewRow) 的检查,确保不对新行进行可见性设置,从而避免了 System.InvalidOperationException 错误。希望这个修改可以解决你的问题。

程序员

现在需要实现,当我的鼠标在搜索框以外点击时,可以恢复原本表格的内容

在这里插入图片描述

为了在鼠标点击搜索框以外的地方时恢复原本表格的内容,我们可以在 LostFocus 事件中添加相应的逻辑。具体步骤如下:

  1. searchTextBox 添加 LostFocus 事件处理程序。
  2. LostFocus 事件处理程序中,检查鼠标是否在搜索按钮以外的地方点击。
  3. 如果是,则恢复原本表格的内容。

以下是相应的代码修改:

private void SearchTextBox_LostFocus(object sender, EventArgs e)
{
    if (!searchButton.Bounds.Contains(searchButton.PointToClient(Cursor.Position)))
    {
        // 鼠标点击搜索按钮以外的地方,恢复原本表格的内容
        RestoreOriginalContent();
    }

    if (string.IsNullOrWhiteSpace(searchTextBox.Text))
    {
        searchTextBox.Text = "点击搜索图书";
    }
}

private void RestoreOriginalContent()
{
    // 恢复原本表格的内容,可以重新加载或者重新设置可见性等
    // 这里简化为重新加载原本的图书信息
    dataGridView1.Rows.Clear();

    string[] book1 = new string[] { "百年孤独", "马尔克斯", "文学", "√" };
    string[] book2 = new string[] { "巴黎圣母院", "雨果", "文学", "√" };
    object[] books = new object[] { book1, book2 /* 在此添加更多图书 */ };

    foreach (string[] bookArray in books)
    {
        dataGridView1.Rows.Add(bookArray);
    }
}

private void SearchButton_Click(object sender, System.EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower();

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        // 检查是否为新行
        if (!row.IsNewRow)
        {
            bool match = false;

            for (int i = 0; i < row.Cells.Count; i++)
            {
                if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
                {
                    match = true;
                    break;
                }
            }

            row.Visible = match;
        }
    }
}

这样,当鼠标在搜索框以外点击时,会调用 RestoreOriginalContent 方法来恢复原本表格的内容。你可以根据实际需求进行进一步的修改和优化。

程序员

我希望实现两个需求
1、在调试时添加的书籍信息回传到代码中
2、在调试时添加的书籍也可以通过搜索显示

在这里插入图片描述

为了实现这两个需求,我们可以在调试时动态添加书籍信息,并确保这些信息会传回到代码中。同时,我们需要修改搜索逻辑,以便在搜索时能够显示这些添加的书籍。

首先,我们修改 RestoreOriginalContent 方法,将书籍信息存储在一个集合中:

private List<string[]> originalBooks;

private void RestoreOriginalContent()
{
    // 恢复原本表格的内容,可以重新加载或者重新设置可见性等
    // 这里简化为重新加载原本的图书信息
    dataGridView1.Rows.Clear();

    originalBooks = new List<string[]>();

    string[] book1 = new string[] { "百年孤独", "马尔克斯", "文学", "√" };
    string[] book2 = new string[] { "巴黎圣母院", "雨果", "文学", "√" };

    originalBooks.Add(book1);
    originalBooks.Add(book2);

    foreach (string[] bookArray in originalBooks)
    {
        dataGridView1.Rows.Add(bookArray);
    }
}

接下来,在添加书籍的方法中,我们将新添加的书籍信息同时存储在 originalBooks 中:

private void AddButton_Click(object sender, EventArgs e)
{
    // 弹出输入框,添加图书信息
    // 你可以根据需要实现输入框逻辑,这里简化为示例
    string bookTitle = Prompt.ShowDialog("输入书名:", "添加图书");
    string author = Prompt.ShowDialog("输入作者:", "添加图书");
    string category = Prompt.ShowDialog("输入书籍类型:", "添加图书");

    // 添加图书到表格
    string[] newBook = new string[] { bookTitle, author, category, "√" };
    dataGridView1.Rows.Add(newBook);

    // 同时将新添加的书籍信息存储在originalBooks中
    originalBooks.Add(newBook);
}

最后,在搜索按钮的点击事件中,我们需要考虑搜索时同时显示新添加的书籍信息:

private void SearchButton_Click(object sender, System.EventArgs e)
{
    string searchText = searchTextBox.Text.ToLower();

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        // 检查是否为新行
        if (!row.IsNewRow)
        {
            bool match = false;

            for (int i = 0; i < row.Cells.Count; i++)
            {
                if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
                {
                    match = true;
                    break;
                }
            }

            row.Visible = match;
        }
    }

    // 同时考虑在搜索时显示新添加的书籍信息
    foreach (string[] newBook in originalBooks)
    {
        bool match = false;

        for (int i = 0; i < newBook.Length; i++)
        {
            if (newBook[i].ToLower().Contains(searchText))
            {
                match = true;
                break;
            }
        }

        if (match)
        {
            dataGridView1.Rows.Add(newBook);
        }
    }
}

这样,搜索时就会同时显示原本的书籍信息和新添加的书籍信息。

程序员

错误 CS0246 未能找到类型或命名空间名“List<>”(是否缺少 using 指令或程序集引用?) LibraryTry

在这里插入图片描述

CS0246错误表示编译器无法找到指定的类型或命名空间。在这种情况下,可能是因为缺少引用或使用了未被识别的类型。在C#中,List<>属于System.Collections.Generic命名空间,因此您需要添加正确的引用。

请确保您的代码开头有以下命名空间的引用:

using System.Collections.Generic;

如果您的代码中已经包含了这个引用,但仍然报错,请确保项目的引用中包含 System.Collections.dll 或者是 .NET Framework 的适当版本。

在Visual Studio中,您可以右键单击项目,选择“添加” > “引用” > “程序集” > “Framework”,然后选中 System.Collections 并点击“确定”。

添加引用后,再次编译您的项目,看看是否解决了CS0246错误。

程序员

调试时报错:System.NullReferenceException:“未将对象引用设置到对象的实例。”

在这里插入图片描述

System.NullReferenceException表示您的代码尝试访问一个未初始化的对象引用。这通常发生在尝试使用空引用(null)的对象的属性、方法或字段时。

在您的代码中,我注意到了一处可能引起此错误的地方。请检查 clickedCell 对象是否被正确初始化。在以下代码中:

private void SearchButton_Click(object sender, System.EventArgs e)
{
    if (clickedCell != null)
    {
        // 检索用于搜索的图书标题。
        string bookTitle = (string)clickedCell.Value;

        // 在线搜索图书(你可以修改此 URL 或添加自己的搜索逻辑)。
        System.Diagnostics.Process.Start("http://search.library.com/results.aspx?q=" + bookTitle);
    }
}

确保 clickedCell 不是空引用。您可以通过以下方式之一确保其初始化:

  1. 在适当的位置初始化 clickedCell 对象,例如在构造函数中。
  2. 在方法开始时检查 clickedCell 是否为 null,并相应地处理。

如果这不是引起问题的地方,请提供更多的代码或者指明错误的具体位置,以便更好地帮助您解决问题。

程序员

完整项目文档
这是完整的项目文档,看错在哪里?如何修改,只需要提供修改处的代码

在这里插入图片描述

你的代码基本上是正确的,但我注意到两个方面可以进行改进:

  1. 错误处理:
    添加错误处理以确保 Prompt 对话框中的用户输入不为空。这可以防止用户在没有输入任何文本的情况下点击 “确定” 时可能出现的问题。

    public static class Prompt
    {
        public static string ShowDialog(string text, string caption)
        {
            Form prompt = new Form()
            {
                Width = 500,
                Height = 150,
                FormBorderStyle = FormBorderStyle.FixedDialog,
                Text = caption,
                StartPosition = FormStartPosition.CenterScreen
            };
            Label textLabel = new Label() { Left = 50, Top = 20, Text = text };
            TextBox inputBox = new TextBox() { Left = 50, Top = 50, Width = 400 };
            Button confirmation = new Button() { Text = "确定", Left = 350, Width = 100, Top = 70 };
            confirmation.Click += (sender, e) =>
            {
                if (!string.IsNullOrWhiteSpace(inputBox.Text))
                {
                    prompt.Close();
                }
                else
                {
                    MessageBox.Show("请输入有效内容", "提示");
                }
            };
            prompt.Controls.Add(confirmation);
            prompt.Controls.Add(textLabel);
            prompt.Controls.Add(inputBox);
            prompt.ShowDialog();
            return inputBox.Text;
        }
    }
    
  2. 搜索逻辑:
    优化搜索逻辑以确保不区分大小写,并正确处理空搜索。

    private void SearchButton_Click(object sender, EventArgs e)
    {
        string searchText = searchTextBox.Text.ToLower().Trim();
        if (string.IsNullOrWhiteSpace(searchText))
        {
            MessageBox.Show("请输入搜索内容", "提示");
            return;
        }
    
        // 清除现有行
        dataGridView1.Rows.Clear();
    
        // 搜索并显示匹配的 originalBooks
        foreach (string[] newBook in originalBooks)
        {
            bool match = false;
    
            for (int i = 0; i < newBook.Length; i++)
            {
                if (newBook[i].ToLower().Contains(searchText))
                {
                    match = true;
                    break;
                }
            }
    
            if (match)
            {
                dataGridView1.Rows.Add(newBook);
            }
        }
    }
    

进行这些修改,你的代码应该更有效地工作。
程序员

我现在仍无法搜索到新添加的书籍

在这里插入图片描述

抱歉对此造成困扰。在你的代码中,我注意到在搜索时只使用了 originalBooks 列表,而没有考虑到在运行时添加的新书籍。

我建议你将新添加的书籍也存储在一个列表中,然后在搜索时同时考虑两个列表。以下是相应的修改:

  1. 在类的开头添加一个新的 List 用于存储新添加的书籍:

    private List<string[]> newBooks;
    
  2. InitializeSearchAndAddComponents 方法中初始化这个列表:

    private void InitializeSearchAndAddComponents()
    {
        // ... (之前的代码)
    
        // 初始化 newBooks 列表
        newBooks = new List<string[]>();
    }
    
  3. AddButton_Click 方法中,将新添加的书籍存储到 newBooks 列表中:

    private void AddButton_Click(object sender, EventArgs e)
    {
        // ... (之前的代码)
    
        // 添加图书到表格
        string[] newBook = new string[] { bookTitle, author, category, "√" };
        dataGridView1.Rows.Add(newBook);
    
        // 同时将新添加的书籍信息存储在 newBooks 中
        newBooks.Add(newBook);
    }
    
  4. 修改 SearchButton_Click 方法,考虑两个列表:

    private void SearchButton_Click(object sender, EventArgs e)
    {
        string searchText = searchTextBox.Text.ToLower().Trim();
        if (string.IsNullOrWhiteSpace(searchText))
        {
            MessageBox.Show("请输入搜索内容", "提示");
            return;
        }
    
        // 清除现有行
        dataGridView1.Rows.Clear();
    
        // 搜索并显示匹配的 originalBooks
        foreach (string[] originalBook in originalBooks)
        {
            bool match = false;
    
            for (int i = 0; i < originalBook.Length; i++)
            {
                if (originalBook[i].ToLower().Contains(searchText))
                {
                    match = true;
                    break;
                }
            }
    
            if (match)
            {
                dataGridView1.Rows.Add(originalBook);
            }
        }
    
        // 搜索并显示匹配的 newBooks
        foreach (string[] newBook in newBooks)
        {
            bool match = false;
    
            for (int i = 0; i < newBook.Length; i++)
            {
                if (newBook[i].ToLower().Contains(searchText))
                {
                    match = true;
                    break;
                }
            }
    
            if (match)
            {
                dataGridView1.Rows.Add(newBook);
            }
        }
    }
    

通过这些修改,你应该能够搜索到新添加的书籍了。

程序员

添加功能,在鼠标点击搜索框以外的区域时,可以显示新添加的书籍所在行

在这里插入图片描述

为了在鼠标点击搜索框以外的区域时显示新添加的书籍所在行,你可以修改 SearchTextBox_LostFocus 方法。在这个方法中,可以检查鼠标点击的位置,如果在搜索按钮以外的区域,则将新添加的书籍行显示出来。

以下是相应的修改:

private void SearchTextBox_LostFocus(object sender, EventArgs e)
{
    Point relativePoint = searchButton.PointToClient(Cursor.Position);

    if (!searchButton.Bounds.Contains(relativePoint))
    {
        // 鼠标点击搜索按钮以外的地方,恢复原本表格的内容
        RestoreOriginalContent();

        // 同时显示新添加的书籍行
        foreach (string[] newBook in newBooks)
        {
            dataGridView1.Rows.Add(newBook);
        }
    }

    if (string.IsNullOrWhiteSpace(searchTextBox.Text))
    {
        searchTextBox.Text = "点击搜索图书";
    }
}

这样,当鼠标点击搜索框以外的区域时,会触发 RestoreOriginalContent 方法来恢复原本表格的内容,并且显示新添加的书籍行。

报错解决方案及细节补充

1、如何查看自己创建的是不是Windows应用程序

右击解决方案下方的项目,点击属性,在属性页查看输出类型,为Windows应用程序即可

纯编程从零到一创建图书管理系统V1.0_第16张图片

2、拖动完datagridview控件后,没有编辑列选项怎么办?

鼠标放在控件内部右击,点击编辑列/或鼠标点击datagridview控件,在右下角属性界面,点击编辑列

纯编程从零到一创建图书管理系统V1.0_第17张图片
纯编程从零到一创建图书管理系统V1.0_第18张图片

3、当前上下文中不存在名称“InitializeComponent”,“dataGridViewBooks”

InitializeComponent是方法,不存在说明没有调用方法,dataGridViewBooks是控件名,真实的控件名在默认的情况下为dataGridView1,在下图查找

纯编程从零到一创建图书管理系统V1.0_第19张图片

4、调试时报错:System.NullReferenceException:“未将对象引用设置到对象的实例。

System.NullReferenceException表示您的代码尝试访问一个未初始化的对象引用。这通常发生在尝试使用空引用(null)的对象的属性、方法或字段时。

点此跳转解决方案

5、未能找到类型或命名空间名“List<>”(是否缺少 using 指令或程序集引用?)

using System.Collections.Generic;

6、在调试时,报错System.InvalidOperationException:“不能将未提交的新行设置为不可见。”

这个错误通常出现在尝试在 DataGridView 中将未提交的新行设置为不可见时。为了解决这个问题,我们可以在搜索时,先判断行是否处于编辑状态,如果是,我们需要先提交更改。

点此跳转解决方案

完整代码段

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using System.Collections.Generic;


namespace LibraryTry
{
    public partial class Form1 : Form
    {
        // 添加搜索框的文本框
        private TextBox searchTextBox;
        // 添加搜索按钮
        private Button searchButton;
        // 添加按钮
        private Button addButton;
        // 添加删除按钮列
        private DataGridViewButtonColumn deleteButtonColumn;
        //添加一个新的 List<string[]> 用于存储新添加的书籍
        private List<string[]> newBooks;
        // Form1公共方法
        public Form1()
        {
            InitializeComponent();
            InitializeDataGridView();
            InitializeContextMenu();
            InitializeSearchAndAddComponents();
        }
        private void InitializeSearchAndAddComponents()
        {
            // 在表格左侧添加搜索框列
            searchTextBox = new TextBox();
            dataGridView1.Controls.Add(searchTextBox);
            searchTextBox.Text = "点击搜索图书";
            searchTextBox.Location = new Point(0, 0);
            searchTextBox.GotFocus += SearchTextBox_GotFocus;
            searchTextBox.LostFocus += SearchTextBox_LostFocus;

            searchButton = new Button();
            dataGridView1.Controls.Add(searchButton);
            searchButton.Text = "搜索";
            searchButton.Location = new Point(0, searchTextBox.Height);
            searchButton.Click += SearchButton_Click;

            // 添加搜索按钮列
            addButton = new Button();
            dataGridView1.Controls.Add(addButton);
            addButton.Text = "添加";
            addButton.Location = new Point(0, searchTextBox.Height + searchButton.Height);
            addButton.Click += AddButton_Click;

            // 添加删除按钮列
            deleteButtonColumn = new DataGridViewButtonColumn();
            deleteButtonColumn.HeaderText = "删除";
            deleteButtonColumn.Name = "DeleteButtonColumn";
            deleteButtonColumn.Text = "X";
            deleteButtonColumn.UseColumnTextForButtonValue = true;
            dataGridView1.Columns.Add(deleteButtonColumn);
            dataGridView1.CellClick += DataGridView1_CellClick;

            // 初始化 newBooks 列表
            newBooks = new List<string[]>();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // Resize the height of the column headers. 
            dataGridView1.AutoResizeColumnHeadersHeight();

            // Resize all the row heights to fit the contents of all non-header cells.
            dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders);

        }
        private void InitializeDataGridView()
            {
            #region
            // 创建一个无绑定的 DataGridView,包含必要的列。
            dataGridView1.ColumnCount = 4;
                dataGridView1.ColumnHeadersVisible = true;

                // 设置列标题样式。
                DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();
                columnHeaderStyle.BackColor = Color.Beige;
                columnHeaderStyle.Font = new Font("Verdana", 10, FontStyle.Bold);
                dataGridView1.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

            // 设置图书馆的列标题。
            dataGridView1.Columns[0].Name = "标题";
            dataGridView1.Columns[1].Name = "作者";
            dataGridView1.Columns[2].Name = "分类";
            dataGridView1.Columns[3].Name = "状态"; // 添加了一个列来表示图书状态。

                // 使用图书信息填充行。
                string[] book1 = new string[] { "百年孤独", "马尔克斯", "文学", "√" };
                string[] book2 = new string[] { "巴黎圣母院", "雨果", "文学", "√" };
                // 根据需要添加更多图书。
                object[] books = new object[] { book1, book2 /* 在此添加更多图书 */ };

                foreach (string[] bookArray in books)
                {
                dataGridView1.Rows.Add(bookArray);
                }
            #endregion
            DataGridViewButtonColumn deleteButtonColumn = new DataGridViewButtonColumn();
            deleteButtonColumn.HeaderText = "删除";
            deleteButtonColumn.Name = "DeleteButtonColumn";
            deleteButtonColumn.Text = "X";
            deleteButtonColumn.UseColumnTextForButtonValue = true;
            dataGridView1.Columns.Add(deleteButtonColumn);
        }
        private void SearchTextBox_GotFocus(object sender, EventArgs e)
        {
            if (searchTextBox.Text == "点击搜索图书")
            {
                searchTextBox.Text = "";
            }
        }
        private void SearchTextBox_LostFocus(object sender, EventArgs e)
        {
            if (!searchButton.Bounds.Contains(searchButton.PointToClient(Cursor.Position)))
            {
                // 鼠标点击搜索按钮以外的地方,恢复原本表格的内容
                RestoreOriginalContent();
            }
            if (string.IsNullOrWhiteSpace(searchTextBox.Text))
            {
                searchTextBox.Text = "点击搜索图书";
            }
        }
      
        private List<string[]> originalBooks;
        private void RestoreOriginalContent()
        {
            // 恢复原本表格的内容,可以重新加载或者重新设置可见性等
            // 这里简化为重新加载原本的图书信息
            dataGridView1.Rows.Clear();
            originalBooks = new List<string[]>();

            string[] book1 = new string[] { "百年孤独", "马尔克斯", "文学", "√" };
            string[] book2 = new string[] { "巴黎圣母院", "雨果", "文学", "√" };
            object[] books = new object[] { book1, book2 /* 在此添加更多图书 */ };

            originalBooks.Add(book1);
            originalBooks.Add(book2);
            foreach (string[] bookArray in books)
            {
                dataGridView1.Rows.Add(bookArray);
            }
        }
        public static class Prompt
        {
            public static string ShowDialog(string text, string caption)
            {
                Form prompt = new Form()
                {
                    Width = 500,
                    Height = 150,
                    FormBorderStyle = FormBorderStyle.FixedDialog,
                    Text = caption,
                    StartPosition = FormStartPosition.CenterScreen
                };
                Label textLabel = new Label() { Left = 50, Top = 20, Text = text };
                TextBox inputBox = new TextBox() { Left = 50, Top = 50, Width = 400 };
                Button confirmation = new Button() { Text = "确定", Left = 350, Width = 100, Top = 70 };
                confirmation.Click += (sender, e) => {
                    //prompt.Close(); 
                    if (!string.IsNullOrWhiteSpace(inputBox.Text))
                    {
                        prompt.Close();
                    }
                    else
                    {
                        MessageBox.Show("请输入有效内容", "提示");
                    }

                };
                prompt.Controls.Add(confirmation);
                prompt.Controls.Add(textLabel);
                prompt.Controls.Add(inputBox);
                prompt.ShowDialog();
                return inputBox.Text;
            }
        }

        private void AddButton_Click(object sender, EventArgs e)
        {
            // 弹出输入框,添加图书信息
            // 你可以根据需要实现输入框逻辑,这里简化为示例
            string bookTitle = Prompt.ShowDialog("输入书名:", "添加图书");
            string author = Prompt.ShowDialog("输入作者:", "添加图书");
            string category = Prompt.ShowDialog("输入书籍类型:", "添加图书");

            // 添加图书到表格
            string[] newBook = new string[] { bookTitle, author, category, "√" };
            dataGridView1.Rows.Add(newBook);

            // 同时将新添加的书籍信息存储在originalBooksoriginalBooks.Add(newBook);
            newBooks.Add(newBook);
        }

        private void InitializeContextMenu()
            {
                // 创建用于搜索图书(或在此情况下为图书信息)的菜单项。
                ToolStripMenuItem searchBook = new ToolStripMenuItem("搜索图书", null,
                    new System.EventHandler(SearchButton_Click));

                // 将菜单项添加到快捷菜单中。
                ContextMenuStrip bookMenu = new ContextMenuStrip();
                bookMenu.Items.Add(searchBook);

            // 为第一列(标题)设置快捷菜单。
            dataGridView1.Columns[0].ContextMenuStrip = bookMenu;
            dataGridView1.MouseDown += new MouseEventHandler(dataGridViewBooks_MouseDown);
            }


           private DataGridViewCell clickedCell;

            // 处理鼠标按下事件以捕获点击的单元格。
            private void dataGridViewBooks_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)
                {
                    DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);
                    if (hit.Type == DataGridViewHitTestType.Cell)
                    {
                        clickedCell = dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex];
                    }
                }
            }


        private void SearchButton_Click(object sender, System.EventArgs e)
        {
            string searchText = searchTextBox.Text.ToLower().Trim();
            if (string.IsNullOrWhiteSpace(searchText))
            {
                MessageBox.Show("请输入搜索内容", "提示");
                return;
            }


            // 清除现有行
            dataGridView1.Rows.Clear();
            
            foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                if (!row.IsNewRow)
                {
                    bool match = false;

                    for (int i = 0; i < row.Cells.Count; i++)
                    {
                        if (row.Cells[i].Value != null && row.Cells[i].Value.ToString().ToLower().Contains(searchText))
                        {
                            match = true;
                            break;
                        }
                    }

                    row.Visible = match;
                }


            }
            // 同时考虑在搜索时显示新添加的书籍信息
            //foreach (string[] newBook in originalBooks)
            //{
            //    bool match = false;

            //    for (int i = 0; i < newBook.Length; i++)
            //    {
            //        if (newBook[i].ToLower().Contains(searchText))
            //        {
            //            match = true;
            //            break;
            //        }
            //    }

            //    if (match)
            //    {
            //        dataGridView1.Rows.Add(newBook);
            //    }
            //}
            // 搜索并显示匹配的 originalBooks
            foreach (string[] originalBook in originalBooks)
            {
                bool match = false;

                for (int i = 0; i < originalBook.Length; i++)
                {
                    if (originalBook[i].ToLower().Contains(searchText))
                    {
                        match = true;
                        break;
                    }
                }

                if (match)
                {
                    dataGridView1.Rows.Add(originalBook);
                }
            }
            // 搜索并显示匹配的 newBooks
            foreach (string[] newBook in newBooks)
            {
                bool match = false;

                for (int i = 0; i < newBook.Length; i++)
                {
                    if (newBook[i].ToLower().Contains(searchText))
                    {
                        match = true;
                        break;
                    }
                }

                if (match)
                {
                    dataGridView1.Rows.Add(newBook);
                }
            }
        }
        private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // 处理删除按钮点击事件
            if (e.ColumnIndex == dataGridView1.Columns["DeleteButtonColumn"].Index && e.RowIndex >= 0)
            {
                // 弹出确认框
                DialogResult result = MessageBox.Show("您确定要删除图书吗?", "确认删除", MessageBoxButtons.OKCancel);
                if (result == DialogResult.OK)
                {
                    // 确认删除后,从表格中移除对应行
                    dataGridView1.Rows.RemoveAt(e.RowIndex);
                }
            }
        }


    }
}

总结

目前这个系统只是第一版,有很多不足的地方,欢迎各位道友提出改进意见,我期望这个系统最后可以实现管理我的书库,前进的道路总是荆棘遍布,加油!
最后感谢大家的喜爱,喜欢本文的话,给博主点个赞吧!记得收藏加关注哦!道友们的支持就是我更新的源动力!
回到顶部

你可能感兴趣的:(2024进行时,人工智能,visual,studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记)