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

这篇具有很好参考价值的文章主要介绍了纯编程从零到一创建图书管理系统V1.0。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

目录

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

效果图

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记
纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

功能列表

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

2、添加图书

  • 根据书籍信息添加图书
    纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记
  • 若不填入信息则不进行下一步
    纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

3、搜索添加的图书

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

4、点击“X”删除整行

5、点击控件空白处恢复

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

环境准备

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

创建项目

1、创建项目

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

2、修改项目名(注意遵循命名规范 )

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

4、选择工具箱 >> 所有Windows窗体 >> 将DataGridView空间拖动到窗体中

5、点击编辑列

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

6、点击添加

7、编辑页眉文本

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

8、添加完成后如图

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

对话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);
        }
    }
}

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

以下代码为在 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);
            }
        }
    }
}

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

using Microsoft.VisualBasic;

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

using System.Windows.Forms;

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

string bookTitle = Interaction.InputBox(“输入书名:”, “添加图书”);
string author = Interaction.InputBox(“输入作者:”, “添加图书”);
string category = Interaction.InputBox(“输入书籍类型:”, “添加图书”);
要使用以上语句需要什么条件?
纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记
Interaction.InputBox 方法通常用于 Windows Forms 应用程序。为了使用这个方法,你需要确保以下条件满足:

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

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

using System.Windows.Forms;

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

如果你已经确保项目是 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 程序集。

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

以上的操作适用于VS2019吗?

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

在 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”的问题。如果仍然遇到问题,请检查你的项目引用和命名空间。

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

如果在添加 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 命名空间。

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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); 来删除整行。同时,通过隐藏不符合条件的行来实现搜索的效果。

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

感谢您的说明。如果不需要在线搜索,而是根据已有的书籍名、作者名和书籍类型进行搜索,可以调整 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;
    }
}

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

抱歉对于之前的建议造成了困扰。我注意到你在代码中使用了 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;
    }
}

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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、当我在搜索框中输入文字,根据输入的文字检索表格中所有包含输入文字的单元格,并显示该单元格所在的行,且不显示不符合条件的单元格所在的行

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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;
    }
}

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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;
    }
}

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

为了将搜索按钮放在添加按钮上方,你可以调整它们的位置。在 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;

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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 来决定是否显示该行。这样,只有包含搜索文本的行会显示,而不包含搜索文本的行会被隐藏。

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

出现这个错误的原因是在设置 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 错误。希望这个修改可以解决你的问题。

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

为了在鼠标点击搜索框以外的地方时恢复原本表格的内容,我们可以在 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 方法来恢复原本表格的内容。你可以根据实际需求进行进一步的修改和优化。

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

首先,我们修改 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);
        }
    }
}

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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

using System.Collections.Generic;

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

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

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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,并相应地处理。

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

  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);
            }
        }
    }
    

进行这些修改,你的代码应该更有效地工作。
纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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

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

    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);
            }
        }
    }
    

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

为了在鼠标点击搜索框以外的区域时显示新添加的书籍所在行,你可以修改 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,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记
纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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

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

纯编程从零到一创建图书管理系统V1.0,2024进行时,人工智能,visual studio,人工智能,人机交互,c#,visualstudio,经验分享,笔记

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);
                }
            }
        }


    }
}

总结

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

到了这里,关于纯编程从零到一创建图书管理系统V1.0的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python从零到一构建项目

    随着互联网的发展,网络上的信息量急剧增长,而获取、整理和分析这些信息对于很多人来说是一项艰巨的任务。而Python作为一种功能强大的编程语言,它的爬虫能力使得我们能够自动化地从网页中获取数据,大大提高了效率。本文将分享如何从零到一构建一个简单的网络爬

    2024年02月09日
    浏览(58)
  • 从零到一发布 NPM 包

    如果你负责前端的基础能力建设,发布各种功能/插件包犹如家常便饭,所以熟悉对 npm 包的发布与管理是非常有必要的,故此有了本篇总结文章。本篇文章一方面总结,一方面向社区贡献开箱即用的 npm 开发、编译、发布、调试模板,希望帮助到有需要的同学。 辛苦整理良久

    2023年04月08日
    浏览(50)
  • AIGC - Stable Diffusion 搭建【从零到一】

    解决音频内容GPU运算时遇到ffmpeg引起问题 write_py audio_spleeter.txt

    2024年02月09日
    浏览(52)
  • zookeeper单节点部署,手把手从零到一

    kafka戳这里:kafka单节点部署,手把手从零到一 事前准备: 1、一台Linux服务器或者是一台虚拟机 2、准备好JDK环境 3、安装好wget(当然也可以不用这个,只是用于下载安装包的一个工具,所以能下载好包就是没问题的) 4、需要了解vim的一些基础操作,不懂得可自行百度 1.1、

    2023年04月15日
    浏览(52)
  • 长安链---从零到一部署Chainmaker-2.0.0

    长安链部署 长安链·ChainMaker具备自主可控、灵活装配、软硬一体、开源开放的突出特点,由北京微芯研究院、清华大学、北京航空航天大学、腾讯、百度和京东等知名高校、企业共同研发。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。 长安链作为区块链开源

    2023年04月08日
    浏览(52)
  • 如何制作流程图?教你从零到一制作

    如何 制作流程图 ? 在当今快节奏、信息化的社会,流程图已经成为了一种非常重要的沟通工具。它能够帮助我们清晰地表达复杂的过程、系统和思路。那么,如何从零开始制作流程图呢?本文将为你提供一份详细的指南。 一、明确目的和内容 在开始制作流程图之前,首先

    2024年01月24日
    浏览(67)
  • 开发一个Android应用:从零到一的实践指南

    在这篇博文中,我们将逐步探讨如何从头开始构建一个Android应用。我们将从最基本的环境搭建开始,然后深入讨论组件、布局和其他核心概念。在完成整个过程后,你将会掌握一个简单但完整的Android应用开发流程。让我们开始吧! 准备开发环境 创建项目 理解项目结构 设计

    2024年02月08日
    浏览(84)
  • 【30天python从零到一】---第七天:列表和元组

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 Python专栏 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己

    2023年04月19日
    浏览(50)
  • Vue+Electron打包桌面应用(从零到一完整教程)

    切记,整个项目的json文件不能有注释,及时没报错也不行,否则运行命令时还是有问题 参考此视频 1- 1.创建项目 1- 2. 安装依赖运行项目 1- 3.配置Electron 1- 4.修改配置文件 1) vite.config.js 2)main.js(项目根目录新增) 此为electron运行的入口文件 3)preload.js(项目根目录下新增) 4)package

    2024年02月07日
    浏览(52)
  • 从零到一的方法:学习视频剪辑与嵌套合并技巧

    随着社交媒体和数字技术的快速发展,视频制作已是常见的工作。那么如何批量嵌套合并视频呢?下面一起来看云炫AI智剪如何批量合并的方法。 嵌套合并后的视频截图查看。 批量嵌套合并的操作: 操作1、在云炫AI智剪上选择“嵌套合并”功能,切换相应的版块。 操作2、把

    2024年02月02日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包