• 大学生C#遇到问题请求帮助!


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 beijiandingdexua 2024-04-20 22:56 采纳率: 0% 浏览 3 首页/ 编程语言 / 大学生C#遇到问题请求帮助! c#数据库linq 编写 WinFons 应用程序,管理学生的基本信息,包括姓名、年龄和成绩。请使用数据库优先的方式创建数据库并生成实体,然后在 WinForms 应用程序中,使用 LINO 查询和操作这些学生信息。要求如下。(1)使用数据库优先方式创建一个名为Stdent的数据库表,包含姓名、年龄和成绩字段。(2)使用 Entity Framework Core 将数据库表映射到实体类,(3)创建一个 WinFonms 界面,显示学生信息的列表,并包含添加、编辑和删除学生亻息的功能。(4)使用LINQ 查询学生信息,并在界面上显示和操作这些信息。已经写了一大半了,但是现在bug好多好多 public partial class SY7 : Form { private readonly DBContext c = new DBContext(); public SY7() { InitializeComponent(); button1.Click += button1_Click; button2.Click += button2_Click; studentBindingSource.AddingNew += StudentBindingSource_AddingNew; InitStudentData(); LoadStudentData(); } private void StudentBindingSource_AddingNew(object? sender, System.ComponentModel.AddingNewEventArgs e) { var newStudent = new Student(); c.Student.Add(newStudent); e.NewObject = newStudent; } private void button2_Click(object sender, EventArgs e) { c.SaveChanges(); studentBindingSource.EndEdit(); MessageBox.Show("保存成功"); } private void button1_Click(object sender, EventArgs e) { studentBindingSource.RemoveCurrent(); studentBindingSource.EndEdit(); c.SaveChanges(); } private void InitStudentData() { var n = c.Student.Count(); if (n == 0) { c.Student.Add(new Student { Name = "张三", Age = 20, Score = 90 }); c.SaveChanges(); } } private void LoadStudentData() { var students = c.Student.ToList(); studentBindingSource.DataSource = students; } } 数据库的建立代码为 CREATE TABLE [dbo].[Student] ( [Id] INT NOT NULL, [Name] NVARCHAR (50) NULL, [Age] INT NULL, [Score] INT NULL, PRIMARY KEY CLUSTERED ([Id] ASC) ); 然后界面是界面是这样的 现在bug有点多 自己输入的数据保存不到数据库中 然后最开始的那个数据在winform中不显示 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-20 22:56
      关注

      引自免费微信小程序:皆我百晓生

      看起来你在实现这个功能时遇到了一些常见的问题。我会帮你解决这些问题。首先,让我们修复保存和加载数据的问题。然后,我们将确保窗体加载时显示初始数据。

      修复保存和加载数据

      你需要在button2_Click事件处理函数中调用SaveChanges()方法来将更改保存到数据库。同时,由于你已经在StudentBindingSource_AddingNew事件处理函数中添加了新的学生对象,所以不需要再次调用Add方法。另外,在InitStudentData方法中,我们可以通过查询数据库是否存在任何学生记录来决定是否需要插入默认数据。以下是修改后的代码:

      using (var context = new DBContext())
      {
          if (!context.Student.Any())
          {
              context.Student.Add(new Student { Name = "张三", Age = 20, Score = 90 });
              context.SaveChanges();
          }
      }
      
      private void button2_Click(object sender, EventArgs e)
      {
          c.SaveChanges(); // 移除这一行,因为我们在StudentBindingSource_AddingNew事件中已保存新对象
          studentBindingSource.EndEdit();
      
          MessageBox.Show("保存成功");
      }
      
      private void button1_Click(object sender, EventArgs e)
      {
          studentBindingSource.RemoveCurrent();
          studentBindingSource.EndEdit();
          c.SaveChanges();
      }
      

      确保窗体加载时显示初始数据

      LoadStudentData方法中,你已经正确地从数据库加载了所有学生记录并将其绑定到studentBindingSource。然而,为了确保窗体加载时立即显示数据,你需要在Form_Load事件处理函数中调用LoadStudentData方法。这里是完整的Form1_Load方法:

      private void Form1_Load(object sender, EventArgs e)
      {
          LoadStudentData();
      }
      

      现在你应该能够在添加新学生、编辑现有学生和删除学生时看到数据被保存到数据库,并且窗体加载时会显示初始学生数据。如果你还有其他问题或错误,可以继续提问,我会尽力提供帮助。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-20 22:56
      关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      根据您提供的代码以及问题描述,可能存在以下问题:

      1. 数据库中的Id字段未设置为自增长,新插入的数据没有自动分配Id。可以将创建表的语句修改为:
      CREATE TABLE [dbo].[Student] (
          [Id]    INT           IDENTITY(1,1) NOT NULL,
          [Name]  NVARCHAR (50) NULL,
          [Age]   INT           NULL,
          [Score] INT           NULL,
          PRIMARY KEY CLUSTERED ([Id] ASC)
      );
      
      1. 数据保存不到数据库中的问题可能是由于未正确绑定数据源。可以检查以下代码:
      private void LoadStudentData()
      {
          var students = c.Student.ToList();
          studentBindingSource.DataSource = students;
      }
      

      确保在窗体设计器中的studentBindingSource控件的DataSource属性已经绑定到了Student实体类。

      1. 界面中最开始的那个数据在winform中不显示,可以检查以下代码:
      private void InitStudentData()
      {
          var n = c.Student.Count();
          if (n == 0)
          {
              c.Student.Add(new Student { Name = "张三", Age = 20, Score = 90 });
              c.SaveChanges();
          }
      }
      

      这里的逻辑是,如果数据库中没有数据,则插入一个新的学生数据。如果确保数据库已经创建,可以在窗体加载时,调用LoadStudentData方法来显示所有已有的学生数据。

      综上所述,您可以尝试以下方案:

      1. 修改创建表的语句,为Id字段设置自增长属性。
      2. 确保数据源已正确绑定。
      3. 调用LoadStudentData方法,在窗体加载时显示所有已有的学生数据。

      最终可能的代码如下:

      CREATE TABLE [dbo].[Student] (
          [Id]    INT           IDENTITY(1,1) NOT NULL,
          [Name]  NVARCHAR (50) NULL,
          [Age]   INT           NULL,
          [Score] INT           NULL,
          PRIMARY KEY CLUSTERED ([Id] ASC)
      );
      
      public partial class SY7 : Form
      {
          private readonly DBContext c = new DBContext();
          
          public SY7()
          {
              InitializeComponent();
              button1.Click += button1_Click;
              button2.Click += button2_Click;
              studentBindingSource.AddingNew += StudentBindingSource_AddingNew;
              LoadStudentData();
          }
          
          private void StudentBindingSource_AddingNew(object? sender, System.ComponentModel.AddingNewEventArgs e)
          {
              var newStudent = new Student();
              c.Student.Add(newStudent);
              e.NewObject = newStudent;
          }
          
          private void button2_Click(object sender, EventArgs e)
          {
              c.SaveChanges();
              studentBindingSource.EndEdit();
              MessageBox.Show("保存成功");
          }
          
          private void button1_Click(object sender, EventArgs e)
          {
              studentBindingSource.RemoveCurrent();
              studentBindingSource.EndEdit();
              c.SaveChanges();
          }
          
          private void LoadStudentData()
          {
              var students = c.Student.ToList();
              studentBindingSource.DataSource = students;
          }
      }
      

      展开全部

      评论
    • 码农阿豪 Java领域优质创作者 2024-04-20 22:56
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      问题分析: 根据提供的代码和界面截图,可以看出以下问题:
      1. 数据库表中的字段名称和 WinForms 界面绑定的数据属性名称不一致,需要将其调整为一致。
      2. 添加学生信息时,使用了 AddingNew 事件,但并没有在界面上触发该事件,因此添加的数据并没有保存到数据库中。
      3. 初始化学生数据时,只添加了一条数据,并且没有包含所有的字段,因此在界面上没有显示该数据。 解决方案:
      4. 将数据库表中的字段名称以及实体类中的属性名称修改为一致,例如将表中的 Name 修改为 StudentName,将实体类中的属性名称也修改为 StudentName
      5. 在界面中添加一个按钮,当用户输入完毕后,点击该按钮将数据保存到数据库中,代码如下:
        private void btnSave_Click(object sender, EventArgs e)
        {
           c.SaveChanges();
           MessageBox.Show("保存成功");
        }
        
      6. 初始化学生数据时,可以手动添加多条数据,并包含所有的字段,代码如下:
        private void InitStudentData()
        {
           var count = c.Student.Count();
           if (count == 0)
           {
               c.Student.Add(new Student { StudentName = "张三", Age = 20, Score = 90 });
               c.Student.Add(new Student { StudentName = "李四", Age = 21, Score = 80 });
               c.Student.Add(new Student { StudentName = "王五", Age = 22, Score = 70 });
               c.SaveChanges();
           }
        }
        

      完整代码: 下面是根据以上解决方案修改后的完整代码:

      public partial class Form1 : Form
      {
          private readonly DBContext c = new DBContext();
          public Form1()
          {
              InitializeComponent();
              btnRefresh.Click += btnRefresh_Click;
              btnSave.Click += btnSave_Click;
              btnDelete.Click += btnDelete_Click;
              studentBindingSource.AddingNew += StudentBindingSource_AddingNew;
              InitStudentData();
              LoadStudentData();
          }
          private void btnRefresh_Click(object sender, EventArgs e)
          {
              LoadStudentData();
          }
          private void btnSave_Click(object sender, EventArgs e)
          {
              c.SaveChanges();
              MessageBox.Show("保存成功");
          }
          private void btnDelete_Click(object sender, EventArgs e)
          {
              studentBindingSource.RemoveCurrent();
              studentBindingSource.EndEdit();
              c.SaveChanges();
          }
          private void StudentBindingSource_AddingNew(object sender, System.ComponentModel.AddingNewEventArgs e)
          {
              var newStudent = new Student();
              c.Student.Add(newStudent);
              e.NewObject = newStudent;
          }
          private void InitStudentData()
          {
              var count = c.Student.Count();
              if (count == 0)
              {
                  c.Student.Add(new Student { StudentName = "张三", Age = 20, Score = 90 });
                  c.Student.Add(new Student { StudentName = "李四", Age = 21, Score = 80 });
                  c.Student.Add(new Student { StudentName = "王五", Age = 22, Score = 70 });
                  c.SaveChanges();
              }
          }
          private void LoadStudentData()
          {
              var students = c.Student.ToList();
              studentBindingSource.DataSource = students;
          }
      }
      

      最终界面效果如下: img

      展开全部

      评论
    • GISer Liu 2024-04-22 03:26
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      首先,你的代码中存在一些问题导致数据无法保存到数据库或显示问题。我会逐一分析并提供解决方案。

      1. 数据库表中没有设置自增主键,这可能导致数据插入失败。
      2. 在初始化数据时,你直接指定了 Id 字段,而没有使用自增方式生成主键。
      3. 添加新学生时,没有正确保存更改到数据库中。
      4. 界面初始化时,没有加载数据库中已有的学生数据。
        针对以上问题,我提供以下解决方案:
        首先,确保数据库表的主键设置为自增。修改数据库表创建代码如下:
        sqlCopy code
        CREATE TABLE [dbo].[Student] (
        [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        [Name] NVARCHAR(50) NULL,
        [Age] INT NULL,
        [Score] INT NULL
        );
        
        接下来,修改代码中的初始化数据方法,使用自增方式生成主键,并确保正确保存更改到数据库:
        csharpCopy code
        private void InitStudentData()
        {
        var n = c.Student.Count();
        if (n == 0)
        {
        var newStudent = new Student { Name = "张三", Age = 20, Score = 90 };
        c.Student.Add(newStudent);
        c.SaveChanges(); // 保存更改到数据库
        // 重新加载数据
        LoadStudentData();
        }
        }
        
        在添加新学生时,确保调用 SaveChanges 方法保存更改到数据库:
        csharpCopy code
        private void StudentBindingSource_AddingNew(object? sender, System.ComponentModel.AddingNewEventArgs e)
        {
        var newStudent = new Student();
        c.Student.Add(newStudent);
        c.SaveChanges(); // 保存更改到数据库
        e.NewObject = newStudent;
        }
        
        最后,在界面初始化时加载数据库中已有的学生数据:
        csharpCopy code
        private void LoadStudentData()
        {
        var students = c.Student.ToList();
        studentBindingSource.DataSource = students;
        }
        
        通过以上修改,你的代码应该能够正确保存和显示学生数据了。记得确保每次操作数据库时都及时保存更改,以及在需要时重新加载数据。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Kibana8.4在Linux系统上的安装(ELK安装part3)
    【软件测试】使用边界值分析法和等价类划分法计算佣金
    目标检测:二维码检测方案
    论文阅读笔记《Locality Preserving Matching》
    LeetCode每日一题(1300. Sum of Mutated Array Closest to Target)
    C语言自定义类型一网打尽(结构体、位段/位域、枚举、联合体)
    vue项目打包后使用reverse-sourcemap反编译到源码(详解版)
    python如何将日期字符串格式化年月日
    初始化使用花括号还是圆括号?
    【正点原子FPGA连载】 第三章 硬件资源详解 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  • 原文地址:https://ask.csdn.net/questions/8092077