using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Miemie
{
// AddRecordForm 类代表新增记录功能的窗体,用于添加收入和支出记录
public partial class AddRecordForm : Form
{
// 定义事件,用于在记录成功保存后通知其他模块,方便其他模块更新显示等操作
public event EventHandler RecordsAdded;
// 存储所有记账记录的列表
private List<Record> records = new List<Record>();
public AddRecordForm()
{
InitializeComponent();
}
// 保存记录按钮的点击事件处理方法
private void btnSaveRecord_Click(object sender, EventArgs e)
{
// 尝试将用户在金额文本框中输入的内容转换为 decimal 类型
if (decimal.TryParse(txtAmount.Text, out decimal amount))
{
// 获取用户在类型下拉框中选择的记录类型(收入或支出)
string type = cmbType.Text;
// 获取用户在分类标签文本框中输入的分类信息
string category = txtCategory.Text;
// 创建一个新的 Record 实例,使用当前输入的金额、类型、分类和当前时间
Record record = new Record(amount, type, category, DateTime.Now);
// 将新记录添加到记录列表中
records.Add(record);
// 触发 RecordsAdded 事件,通知其他关注记录新增情况的模块进行相应处理(比如更新显示等)
RecordsAdded?.Invoke(this, EventArgs.Empty);
// 提示记录保存成功
MessageBox.Show("记录保存成功!");
}
else
{
// 如果金额转换失败,提示用户输入正确的金额格式
MessageBox.Show("请输入正确的金额格式!");
}
}
// 对外提供获取记录列表的方法,方便其他模块获取新增记录模块中管理的所有记录
public List<Record> GetRecords()
{
return records;
}
private void buttonClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void AddRecordForm_Load(object sender, EventArgs e)
{
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Miemie
{
// BudgetForm 类代表总预算功能的窗体,用于展示预算相关信息
public partial class BudgetForm : Form
{
// 家庭总预算金额,初始化为 10000,可修改为从外部读取
private decimal totalBudget;
private decimal usedAmount;
public BudgetForm()
{
InitializeComponent();
txtTotalBudget.TextChanged += (sender, e) => UpdateBudgetFromUserInput();
txtUsedAmount.TextChanged += (sender, e) => UpdateBudgetFromUserInput();
// 更新预算信息显示
}
private void UpdateBudgetFromUserInput()
{
if (decimal.TryParse(txtTotalBudget.Text, out totalBudget) && decimal.TryParse(txtUsedAmount.Text, out usedAmount))
{
UpdateBudgetDisplay();
}
}
// 更新预算信息显示的方法
private void UpdateBudgetDisplay()
{
lblTotalBudget.Text = $"总预算金额:{totalBudget} 元";
lblUsedAmount.Text = $"已使用金额:{usedAmount} 元";
lblRemainingBudget.Text = $"剩余预算金额:{totalBudget - usedAmount} 元";
}
private void buttonClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void BudgetForm_Load(object sender, EventArgs e)
{
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Miemie
{
// CategoryStatisticsForm 类代表分类统计功能的窗体,用于按分类统计收入和支出
public partial class CategoryStatisticsForm : Form
{
// 存储从外部传入的记账记录列表,通过属性进行封装以便更好地管理数据
private List<Record> _records;
private AddRecordForm addRecordForm;
public List<Record> Records
{
get => _records;
set
{
_records = value;
}
}
public CategoryStatisticsForm()
{
InitializeComponent();
// 初始化分类下拉框的选项
cmbCategories.Items.Add("餐饮");
cmbCategories.Items.Add("娱乐");
cmbCategories.Items.Add("购物");
cmbCategories.Items.Add("交通");
cmbCategories.Items.Add("住宿");
cmbCategories.Items.Add("学习");
cmbCategories.Items.Add("美妆");
cmbCategories.Items.Add("旅游");
cmbCategories.Items.Add("医疗");
cmbCategories.Items.Add("通讯");
}
// 统计按钮的点击事件处理方法
private void btnCalculate_Click(object sender, EventArgs e)
{
decimal incomeTotal = 0;
decimal expenseTotal = 0;
string selectedCategory = cmbCategories.Text;
if (_records != null && _records.Count > 0)
{
foreach (Record record in _records)
{
if (record.Category == selectedCategory && record.Type == "收入")
{
incomeTotal += record.Amount;
}
else if (record.Category == selectedCategory && record.Type == "支出")
{
expenseTotal += record.Amount;
}
}
}
lblIncomeTotal.Text = $"收入总计:{incomeTotal} 元";
lblExpenseTotal.Text = $"支出总计:{expenseTotal} 元";
}
// 用于订阅新增记录模块的 RecordsAdded 事件,当有新记录添加时,获取最新记录列表并重新进行统计显示
private void OnRecordsAdded(object sender, EventArgs e)
{
// 获取新增记录模块的实例(这里假设通过某种方式能获取到,实际应用中需要合理的实例管理机制)
AddRecordForm addRecordForm = GetAddRecordFormInstance();
if (addRecordForm != null)
{
// 获取新增记录模块中的最新记录列表,并更新当前的记录列表
Records = addRecordForm.GetRecords();
// 重新进行统计并更新显示结果
btnCalculate_Click(this, EventArgs.Empty);
}
}
// 这里只是示意如何获取新增记录模块的实例,实际应用中需要根据具体的窗体创建、管理以及生命周期等情况来合理实现这个方法,确保能够准确地获取到对应的实例
private AddRecordForm GetAddRecordFormInstance()
{
// 假设通过某种方式已经创建并保存了新增记录模块的实例,这里简单返回(实际需完善逻辑)
return addRecordForm;
}
private void buttonClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void CategoryStatisticsForm_Load(object sender, EventArgs e)
{
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Miemie
{
// MainForm 类代表应用程序的主窗体,包含各个功能模块的入口按钮
public partial class Form1 : Form
{
// 用于存储整个记账本应用的所有记录,这里作为主页面类的一个字段来管理记录列表,方便在各个功能模块间传递和共享数据
private List<Record> allRecords = new List<Record>();
// 新增记录模块的实例,用于在主页面管理其生命周期以及方便与其他模块交互
private AddRecordForm addRecordForm;
// 查看记录模块的实例,用于方便在需要时操作该模块(比如传递记录数据、刷新显示等)
private ViewRecordsForm viewRecordsForm;
// 分类统计模块的实例,同样用于便于与之交互,更新统计结果展示等
private CategoryStatisticsForm categoryStatisticsForm;
public Form1()
{
InitializeComponent();
// 创建新增记录模块的实例
addRecordForm = new AddRecordForm();
// 订阅新增记录模块的 RecordsAdded 事件,当有新记录添加时,更新主页面管理的记录列表,并通知其他相关模块更新显示
addRecordForm.RecordsAdded += OnRecordsAdded;
// 创建查看记录模块的实例
viewRecordsForm = new ViewRecordsForm();
// 初始时将主页面管理的记录列表传递给查看记录模块,使其显示已有记录
viewRecordsForm.Records = allRecords;
// 创建分类统计模块的实例
categoryStatisticsForm = new CategoryStatisticsForm();
// 初始时将主页面管理的记录列表传递给分类统计模块,方便后续进行统计操作
categoryStatisticsForm.Records = allRecords;
}
// 总预算按钮的点击事件处理方法,打开总预算模块窗体
private void btnBudget_Click(object sender, EventArgs e)
{
BudgetForm budgetForm = new BudgetForm();
budgetForm.ShowDialog();
}
// 分类统计按钮的点击事件处理方法,打开分类统计模块窗体
private void btnCategoryStatistics_Click(object sender, EventArgs e)
{
categoryStatisticsForm.ShowDialog();
}
// 新增记录按钮的点击事件处理方法,打开新增记录模块窗体
private void btnAddRecord_Click(object sender, EventArgs e)
{
// 以模态对话框形式显示新增记录窗体,等待用户操作完成并关闭该窗体
addRecordForm.ShowDialog();
// 判断新增记录窗体关闭时的返回结果,如果是用户点击了保存成功等确认操作(这里假设DialogResult.OK表示保存成功,具体可根据实际设置调整)
if (addRecordForm.DialogResult == DialogResult.OK)
{
// 获取新增记录模块中保存的所有记录列表
List<Record> newRecords = addRecordForm.GetRecords();
// 将新增记录模块中的记录合并到主页面管理的记录列表中,实现数据更新
allRecords.AddRange(newRecords);
// 将更新后的记录列表传递给查看记录模块,使其能显示最新的记录信息
viewRecordsForm.Records = allRecords;
// 将更新后的记录列表传递给分类统计模块,以便其基于最新记录重新统计并更新显示
categoryStatisticsForm.Records = allRecords;
}
}
// 个人界面按钮的点击事件处理方法,打开个人界面模块窗体
private void btnPersonal_Click(object sender, EventArgs e)
{
PersonalForm personalForm = new PersonalForm();
personalForm.ShowDialog();
}
// 查看记录按钮的点击事件处理方法,打开查看记录模块窗体
private void btnViewRecords_Click(object sender, EventArgs e)
{
viewRecordsForm.ShowDialog();
}
// 退出按钮的点击事件处理方法,关闭应用程序
private void btnExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
// 事件处理方法,用于响应新增记录模块的 RecordsAdded 事件
// 当有新记录添加时,会在这里更新主页面管理的记录列表,并通知查看记录模块和分类统计模块更新显示
private void OnRecordsAdded(object sender, EventArgs e)
{
// 获取新增记录模块中保存的所有记录列表
List<Record> newRecords = addRecordForm.GetRecords();
// 将新增记录模块中的记录合并到主页面管理的记录列表中,实现数据更新
allRecords.AddRange(newRecords);
// 将更新后的记录列表传递给查看记录模块,使其能显示最新的记录信息
viewRecordsForm.Records = allRecords;
// 将更新后的记录列表传递给分类统计模块,以便其基于最新记录重新统计并更新显示
categoryStatisticsForm.Records = allRecords;
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Miemie
{
// PersonalForm 类代表个人界面相关功能的窗体,包括登录注册、个人信息设置等
public partial class PersonalForm : Form
{
// 用于标记当前是否处于登录状态,初始设为 false,表示未登录
private bool isLoggedIn = false;
// 存储已注册的用户名,初始为空字符串
private string registeredUserName = "";
// 存储已注册的密码,初始为空字符串,密码文本框输入时会显示为加密形式(如星号)
private string registeredPassword = "";
// 存储用户选择的头像图片路径,初始为空字符串,当选择头像后更新此路径
private string avatarPath = "";
// 存储用户选择的界面颜色,初始设为系统默认的白色,通过相关操作可更改此颜色
private Color interfaceColor = Color.White;
public PersonalForm()
{
InitializeComponent();
}
// 登录按钮的点击事件处理方法,验证用户输入的用户名和密码是否匹配已注册信息,匹配则设置登录状态为 true 并提示登录成功
private void btnLogin_Click(object sender, EventArgs e)
{
// 获取用户在登录用户名文本框中输入的内容
string enteredUserName = txtLoginUserName.Text;
// 获取用户在登录密码文本框中输入的内容
string enteredPassword = txtLoginPassword.Text;
// 检查输入的用户名和密码是否与注册时的匹配,如果匹配则设置登录状态为 true,并提示登录成功
if (enteredUserName == registeredUserName && enteredPassword == registeredPassword)
{
isLoggedIn = true;
MessageBox.Show("登录成功!");
// 登录成功后更新界面显示用户名和头像(这里简单更新用户名显示,头像显示需进一步完善图像加载逻辑)
UpdateUIAfterLogin();
}
else
{
// 如果不匹配,提示登录失败
MessageBox.Show("登录失败,请检查用户名和密码。");
}
}
// 注册按钮的点击事件处理方法
private void btnRegister_Click(object sender, EventArgs e)
{
// 获取用户在注册用户名文本框中输入的内容
registeredUserName = txtRegisterUserName.Text;
// 获取用户在注册密码文本框中输入的内容,由于密码文本框设置了 PasswordChar 为 '*',所以获取的是加密后的文本
registeredPassword = txtRegisterPassword.Text;
// 简单提示注册成功,实际可添加更多逻辑,如将注册信息保存到文件或数据库等
MessageBox.Show("注册成功!");
}
// 更改用户名按钮的点击事件处理方法,只有登录成功后才允许更改
private void btnChangeUserName_Click(object sender, EventArgs e)
{
if (isLoggedIn)
{
// 获取更改用户名文本框(txtChangeUserName)中的输入内容,作为新的用户名
string newUserName = txtChangeUserName.Text;
// 将存储的已注册用户名更新为新输入的用户名
registeredUserName = newUserName;
MessageBox.Show("用户名已更改!");
// 更新界面上用于显示用户名的标签(lblUserName)的文本内容,展示新的用户名
lblUserName.Text = registeredUserName;
}
else
{
MessageBox.Show("请先登录。");
}
}
// 更改头像按钮的点击事件处理方法
private void btnChangeAvatar_Click(object sender, EventArgs e)
{
if (isLoggedIn)
{
// 创建一个OpenFileDialog实例,用于弹出文件选择对话框,方便用户选择本地的图片文件作为头像
OpenFileDialog openFileDialog = new OpenFileDialog();
// 设置文件筛选器,限定只显示常见的图片文件格式,便于用户准确选择头像图片,可按需扩展格式列表
openFileDialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.bmp";
// 当用户在文件选择对话框中点击“打开”按钮,表示选择了有效文件,执行以下操作
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的图片文件的完整路径,并赋值给avatarPath变量存储,以便后续使用该路径加载头像图片
avatarPath = openFileDialog.FileName;
MessageBox.Show("头像已选择,显示功能将尽力更新。");
// 调用更新界面显示的方法,尝试在界面上显示选择的头像图片(基础的显示逻辑实现)
UpdateUIAfterLogin();
}
}
else
{
MessageBox.Show("请先登录。");
}
}
// 更改界面颜色按钮的点击事件处理方法
private void btnChangeColor_Click(object sender, EventArgs e)
{
if (isLoggedIn)
{
// 创建一个ColorDialog实例,用于弹出颜色选择对话框
ColorDialog colorDialog = new ColorDialog();
// 如果用户在颜色选择对话框中点击了“确定”按钮,即选择了有效颜色
if (colorDialog.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的颜色,并更新界面颜色变量
interfaceColor = colorDialog.Color;
// 将窗体的背景色设置为用户选择的颜色,实现界面颜色更改效果
this.BackColor = interfaceColor;
MessageBox.Show("界面颜色已更改。");
}
}
else
{
MessageBox.Show("请先登录。");
}
}
// 登录成功后更新界面显示用户名和头像的方法(头像显示部分简单示意,需进一步完善图像加载和显示逻辑)
private void UpdateUIAfterLogin()
{
// 更新界面上用于显示用户名的标签(lblUserName)的文本内容,展示已注册的用户名
lblUserName.Text = registeredUserName;
// 判断头像路径是否为空字符串,如果不为空,表示用户已经选择了头像图片,尝试进行显示操作
if (avatarPath != "")
{
try
{
// 使用Image.FromFile方法从头像路径加载图片文件,创建一个Image对象用于后续显示,这是基础的图片加载方式
Image avatarImage = Image.FromFile(avatarPath);
// 假设界面上有一个名为picAvatar的PictureBox控件用于显示头像图片,将加载的图片设置给该控件的Image属性,实现头像显示
picAvatar.Image = avatarImage;
}
catch (Exception ex)
{
// 如果在加载图片过程中出现异常,弹出消息框提示用户加载头像失败,并显示具体的异常信息,方便用户排查问题
MessageBox.Show($"加载头像失败:{ex.Message}");
}
}
}
private void txtLoginUserName_TextChanged(object sender, EventArgs e)
{
}
private void PersonalForm_Load(object sender, EventArgs e)
{
}
private void buttonClose_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Miemie
{
internal static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
using System;
// Record 类表示记账本中的一条记录,封装了金额、类型、分类和日期等信息
public class Record
{
// 记录的金额,使用 decimal 保证精度,用于存储收入或支出的数值
public decimal Amount { get; set; }
// 记录的类型,取值为 "收入" 或 "支出",区分收入与支出记录
public string Type { get; set; }
// 记录的分类标签,如 "餐饮"、"娱乐" 等,方便分类统计与查询
public string Category { get; set; }
// 记录的日期,精确记录该条记录发生的时间
public DateTime Date { get; set; }
// 构造函数,用于创建 Record 实例时初始化其属性
public Record(decimal amount, string type, string category, DateTime date)
{
Amount = amount;
Type = type;
Category = category;
Date = date;
}
}using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Miemie
{
// ViewRecordsForm类代表查看记录功能的窗体,用于展示已保存的记账记录
// 此类负责从外部接收记账记录列表,并提供加载和刷新显示记录的功能
public partial class ViewRecordsForm : Form
{
// 存储从外部传入的记账记录列表,通过属性来封装列表,方便后续进行数据传递和控制访问
private List<Record> _records;
private AddRecordForm addRecordForm;
public List<Record> Records
{
get => _records;
set
{
_records = value;
// 当外部设置新的记录列表时,更新内部存储的记录列表,并立即加载并显示记录,保证界面能及时展示最新数据
LoadRecords();
}
}
// 用于标记当前选中记录在列表中的索引,初始化为 -1,表示没有选中任何记录
private int selectedIndex = -1;
public ViewRecordsForm()
{
InitializeComponent();
}
// 加载记录到列表框的方法,将记录列表中的每条记录信息整理成字符串形式并添加到列表框中进行展示
private void LoadRecords()
{
lstRecords.Items.Clear();
if (_records != null && _records.Count > 0)
{
// 按照特定格式拼接记录信息字符串,方便用户查看
foreach (Record record in _records)
{
string recordInfo = $"金额:{record.Amount} 元,类型:{record.Type},分类:{record.Category},日期:{record.Date}";
lstRecords.Items.Add(recordInfo);
}
}
}
// 刷新按钮的点击事件处理方法,当用户点击刷新按钮时,会重新加载并显示最新的记账记录信息
private void btnRefresh_Click(object sender, EventArgs e)
{
// 直接调用LoadRecords方法,重新执行加载记录并显示的操作,以更新列表框中显示的记录信息
LoadRecords();
}
// 跳转到新增记录模块按钮的点击事件处理方法,创建AddRecordForm实例并以模态对话框形式显示,方便用户新增记录
private void btnGoToAddRecord_Click(object sender, EventArgs e)
{
// 创建AddRecordForm的实例,用于打开新增记录的窗体
AddRecordForm addRecordForm = new AddRecordForm();
// 以模态对话框形式显示新增记录窗体,此时用户只能操作该窗体,直到关闭它
addRecordForm.ShowDialog();
}
// 列表框的点击事件处理方法,当用户点击列表框中的某条记录时,记录该记录在列表中的索引,用于后续操作判断是否有选中记录
private void lstRecords_Click(object sender, EventArgs e)
{
// 获取用户点击记录在列表框中的索引,并赋值给selectedIndex变量,同时确保索引在有效范围内
if (lstRecords.SelectedIndex >= 0 && lstRecords.SelectedIndex < lstRecords.Items.Count)
{
selectedIndex = lstRecords.SelectedIndex;
}
}
private void btnDeleteRecord_Click(object sender, EventArgs e)
{
// 判断是否有选中的记录,即selectedIndex是否不等于 -1,同时要确保记录列表不为空且选中索引在有效范围内
if (selectedIndex != -1 && _records != null && selectedIndex < _records.Count)
{
// 从记录列表中移除当前选中的记录
_records.RemoveAt(selectedIndex);
// 将选中记录索引重置为 -1,表示当前没有选中任何记录
selectedIndex = -1;
// 调用LoadRecords方法更新界面显示,反映记录删除后的列表情况
LoadRecords();
}
else
{
// 如果没有选中记录或者记录列表为空、选中索引超出范围,弹出提示框告知用户需要先选择要删除的记录
MessageBox.Show("请先选择要删除的记录。");
}
}
private void btnModifyRecord_Click(object sender, EventArgs e)
{
// 判断是否有选中的记录,即selectedIndex是否不等于 -1,同时确保记录列表不为空且选中索引在有效范围内
if (selectedIndex != -1 && _records != null && selectedIndex < _records.Count)
{
// 获取当前选中的记录
Record recordToModify = _records[selectedIndex];
// 用于存储用户修改后的金额,初始化为选中记录的原金额
decimal amount = recordToModify.Amount;
// 用于存储用户修改后的记录类型,初始为选中记录的原类型
string type = recordToModify.Type;
// 用于存储用户修改后的记录分类,初始为选中记录的原分类
string category = recordToModify.Category;
// 弹出自定义输入框让用户修改金额,获取用户输入的文本内容
string inputAmount = GetInput("请修改记录金额(原金额:" + recordToModify.Amount + " 元):", "修改记录");
// 尝试将用户输入的金额文本转换为 decimal 类型,如果转换成功,将值赋给amount变量
if (decimal.TryParse(inputAmount, out amount))
{
// 弹出下拉框让用户修改记录类型(收入或支出),获取用户选择的文本内容
type = GetTypeInput("请修改记录类型(原类型:" + recordToModify.Type + "):", "修改记录");
// 确保用户选择了有效的记录类型,如果没有选择(即type为空字符串),则弹出提示框并返回,不进行后续操作
if (string.IsNullOrEmpty(type))
{
MessageBox.Show("请选择有效的记录类型。");
return;
}
// 弹出自定义输入框让用户修改记录分类,获取用户输入的文本内容
category = GetInput("请修改记录分类(原分类:" + recordToModify.Category + "):", "修改记录");
// 创建一个新的Record实例,使用用户修改后的金额、类型、分类以及原记录的日期作为记录的属性值
Record modifiedRecord = new Record(amount, type, category, recordToModify.Date);
// 更新记录列表中对应记录的属性值,用修改后的记录替换原记录
_records[selectedIndex] = modifiedRecord;
// 调用LoadRecords方法更新界面显示,展示修改后的记录信息
LoadRecords();
}
else
{
// 如果金额转换失败,弹出提示框告知用户输入的金额格式不正确
MessageBox.Show("输入的金额格式不正确,请重新输入。");
}
}
else
{
// 如果没有选中记录或者记录列表为空、选中索引超出范围,弹出提示框告知用户需要先选择要修改的记录
MessageBox.Show("请先选择要修改的记录。");
}
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void lstRecords_SelectedIndexChanged(object sender, EventArgs e)
{
// 获取用户点击记录在列表框中的索引,并赋值给selectedIndex变量,同时确保索引在有效范围内
if (lstRecords.SelectedIndex >= 0 && lstRecords.SelectedIndex < lstRecords.Items.Count)
{
selectedIndex = lstRecords.SelectedIndex;
}
}
// 查找记录按钮的点击事件处理方法,弹出输入框让用户输入查找关键字,然后在记录列表中查找匹配的记录并展示
private void btnSearchRecord_Click(object sender, EventArgs e)
{
// 获取用户输入的查找关键字,弹出自定义输入框提示用户输入
string keyword = GetInput("请输入查找关键字(可按金额、类型、分类、日期等信息查找):", "查找记录");
// 用于存储查找到的匹配记录列表
List<Record> foundRecords = new List<Record>();
if (_records != null && _records.Count > 0)
{
foreach (Record record in _records)
{
// 将记录的各项信息拼接成一个字符串,用于后续判断是否包含关键字
string recordInfo = $"{record.Amount} {record.Type} {record.Category} {record.Date}";
// 判断记录信息字符串是否包含用户输入的关键字(不区分大小写),如果包含则将该记录添加到查找到的记录列表中
if (recordInfo.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0)
{
foundRecords.Add(record);
}
}
// 如果找到了匹配的记录
if (foundRecords.Count > 0)
{
// 先清空列表框原有内容
lstRecords.Items.Clear();
foreach (Record record in foundRecords)
{
// 按照特定格式拼接记录信息字符串,方便用户查看
string recordInfo = $"金额:{record.Amount} 元,类型:{record.Type},分类:{record.Category},日期:{record.Date}";
lstRecords.Items.Add(recordInfo);
}
}
else
{
// 如果没有找到匹配的记录,弹出提示框告知用户
MessageBox.Show("未找到匹配的记录,请重新输入关键字查找。");
}
}
else
{
// 如果记录列表为空,弹出提示框告知用户没有记录可供查找
MessageBox.Show("当前没有记录,无法进行查找操作。");
}
}
// 自定义方法用于获取用户输入的文本信息,弹出一个简单的文本输入框,返回用户输入的内容
private string GetInput(string prompt, string title)
{
// 创建一个Form作为输入框的容器
Form inputForm = new Form();
inputForm.Text = title;
inputForm.Width = 300;
inputForm.Height = 200;
// 创建一个Label用于显示提示信息
Label label = new Label();
label.Text = prompt;
label.Left = 10;
label.Top = 10;
label.Width = 280;
label.Height = 30;
inputForm.Controls.Add(label);
// 创建一个TextBox用于用户输入文本
TextBox textBox = new TextBox();
textBox.Left = 10;
textBox.Top = 50;
textBox.Width = 280;
textBox.Height = 30;
inputForm.Controls.Add(textBox);
// 创建一个Button用于用户确认输入
Button okButton = new Button();
okButton.Text = "确定";
okButton.Left = 100;
okButton.Top = 100;
okButton.Width = 80;
okButton.Height = 30;
okButton.DialogResult = DialogResult.OK;
inputForm.Controls.Add(okButton);
// 设置Form的确认按钮为okButton,这样用户按下回车键等同于点击确定按钮
inputForm.AcceptButton = okButton;
// 显示输入框窗体,并获取用户操作的结果(点击确定或取消等)
DialogResult result = inputForm.ShowDialog();
if (result == DialogResult.OK)
{
// 如果用户点击了确定按钮,返回用户在文本框中输入的内容
return textBox.Text;
}
return "";
}
// 自定义方法用于获取用户选择的记录类型(收入或支出),弹出一个下拉框供用户选择,返回用户选择的内容
private string GetTypeInput(string prompt, string title)
{
// 创建一个Form作为选择框的容器
Form inputForm = new Form();
inputForm.Text = title;
inputForm.Width = 300;
inputForm.Height = 200;
// 创建一个Label用于显示提示信息
Label label = new Label();
label.Text = prompt;
label.Left = 10;
label.Top = 10;
label.Width = 280;
label.Height = 30;
inputForm.Controls.Add(label);
// 创建一个ComboBox用于用户选择记录类型
ComboBox comboBox = new ComboBox();
comboBox.Items.Add("收入");
comboBox.Items.Add("支出");
comboBox.Left = 10;
comboBox.Top = 50;
comboBox.Width = 280;
comboBox.Height = 30;
inputForm.Controls.Add(comboBox);
// 创建一个Button用于用户确认选择
Button okButton = new Button();
okButton.Text = "确定";
okButton.Left = 100;
okButton.Top = 100;
okButton.Width = 80;
okButton.Height = 30;
okButton.DialogResult = DialogResult.OK;
inputForm.Controls.Add(okButton);
// 设置Form的确认按钮为okButton,这样用户按下回车键等同于点击确定按钮
inputForm.AcceptButton = okButton;
// 显示选择框窗体,并获取用户操作的结果(点击确定或取消等)
DialogResult result = inputForm.ShowDialog();
if (result == DialogResult.OK)
{
// 如果用户点击了确定按钮,返回用户在下拉框中选择的内容
return comboBox.Text;
}
return "";
}
private void ViewRecordsForm_Load(object sender, EventArgs e)
{
}
}
}
这是visual studio2022创建的记账本窗体应用程序,现在要求总体分为两个模块,一个为管理员(家长)模块,一个为个人模块,初始弹出窗体可以选择进入二者之一。管理员模块包括个人界面(跟代码中PersonalForm窗体功能一样可复制)、分类统计(跟代码中CategoryStatisticsForm窗体功能一样可复制)、零花钱奖励(查看分类统计后可选择一名用户给予他可选择数额的零花钱奖励,作为此用户的等额收入。所以要求此窗体有按钮用来查看分类统计、查看并选择用户给他奖励(可选择数额))。个人模块包括个人界面(跟代码中PersonalForm窗体功能一样可复制)、编辑记录(跟代码中AddRecordForm窗体功能一样可复制)、总预算(跟代码中BudgetForm窗体功能一样可复制)(ps:此窗体之后会连接到数据库,但是现在还不用)请你为此修改代码使得能实现功能,要求写出修改后窗体的完整代码以及每个窗体的公共控件的所有属性