将数据从一种形式传递到另一种形式(datagridview)
Posted
技术标签:
【中文标题】将数据从一种形式传递到另一种形式(datagridview)【英文标题】:Pass data from one form to another (datagridview) 【发布时间】:2021-08-06 16:43:25 【问题描述】:我正在做一些简单的日志实现。我在 Changelog.cs 中创建了一些 datagridview,其中包含以下列:用户 ID、姓氏、操作名称(例如“授权”)、时间。
(例如:16,布朗,授权,10:30:00)
所以我有 2 个表单:Authorization 和 Changelog
当用户在授权表单中按下“登录”按钮时,我想将此数据插入到 Changelog 中的 datagridview 中。 在 Changelog 中,我有这个构造函数:
public Changelog(string id, string user, string operation, string date)
InitializeComponent();
dataGridView1.Rows[0].Cells[0].Value = id;
dataGridView1.Rows[0].Cells[1].Value = user;
dataGridView1.Rows[0].Cells[2].Value = operation;
dataGridView1.Rows[0].Cells[3].Value = date;
在授权中我得到了这个:
private void button1_Click(object sender, EventArgs e)
DateTime whenClicked = DateTime.Now;
// long authorization code
在授权中做:
Changelog cl = new Changelog(currentUser.Id.ToString(), currentUser.Name, "authorization", whenClicked.ToString())
当然会创建一个新的 Changelog 实例,但我想将此数据插入到 原始实例中
有什么方法可以实现吗?谢谢!
【问题讨论】:
从 Application.OpenForms 中检索表单的当前现有实例。如果您需要将新信息传递给现有实例,您将需要 ChangeLog 表单上的公共方法,该方法接收新数据并插入 DataGridView 那么,变更日志是易变的吗?如果您关闭应用程序并再次打开它,它是空的? (或者更好的“应该”是?) ^^ 我想要的是:如果我必须这样做,我只需通过像 Serilog 这样的日志框架编写一个实际的日志。大多数广泛使用的提供接收器(或目标或任何他们称之为的)来填充 Windows 窗体控件,例如:nuget.org/packages/Serilog.Sinks.WinForms。这增加了一个好处,您可以轻松地将它们写入文件、数据库……而几乎 0 额外(代码编写)成本,只需在配置中添加更多接收器。 您是否碰巧使用了某种形式的依赖注入?如果是这样,还有其他选择。 【参考方案1】:由于史蒂夫的回答似乎不起作用(令我惊讶的是),也许这会对您有所帮助:基本思想是使用事件和静态事件。
因此,在您的 Authorization
表单中,您将声明这样的事件:
public static event EventHandler<ActionLogEventArgs> AuthorizationEvent;
// ^^ `ActionLogEventArgs` are `EventArgs` + your id, user, operation ... props
// Trigger function
protected virtual void OnAuthorization( ActionLogEventArgs args )
var handler = AuthorizationEvent;
handler?.Invoke(null, args);
因此,每当单击“登录”时,您都会构建您的 ActionLogEventArgs
并通过调用 OnAuthorization(args)
触发事件
在您的“变更日志”表单中,您为该事件注册了一个处理程序:
// in ctor:
Authorization.AuthorizationEvent += AddLog;
// ...
private void AddLog(object sender, ActionLogEventArgs e)
// Add to your DataGrid; make sure this executes on UI Thread.
请注意,我选择使用静态事件以避免必须有实例。 我通常更喜欢非静态事件,但这需要更多的努力。
让我们先看看这是否适合你。
在 DataGridView 上
我也想到了:
您实际上可能想要insert 一个新行。
grid.Rows[0].Cells[x].Value = ...
将更改该行,而不是插入新行。
【讨论】:
【参考方案2】:您可以通过查看 Application.OpenForms 属性来检索 Form 的现有实例,然后使用该集合中存在的实例来发送新信息。 但要做到这一点,您需要在 Changelog 和 Authorization 中进行一些更改。 首先删除传递给 Changelog 构造函数的参数并创建一个将信息添加到 DataGridView 的新方法。因此,您可以独立于表单创建来调用此方法。
public Changelog()
InitializeComponent();
public void AddNewLog(string id, string user, string operation, string date)
dataGridView1.Rows[0].Cells[0].Value = id;
dataGridView1.Rows[0].Cells[1].Value = user;
dataGridView1.Rows[0].Cells[2].Value = operation;
dataGridView1.Rows[0].Cells[3].Value = date;
现在在 Authorization 中搜索现有的 Changelog 实例并使用该实例和 AddNewLog 方法添加信息。当然,如果 Changelog 实例不存在,您可以像以前一样创建它(但不传递参数)。
private void button1_Click(object sender, EventArgs e)
DateTime whenClicked = DateTime.Now;
// long authorization code
Changelog cl = Application.OpenForms["Changelog"] as Changelog;
if(cl == null)
cl = new Changelog();
cl.AddNewLog(currentUser.Id.ToString(), currentUser.Name, "authorization", whenClicked.ToString());
【讨论】:
非常感谢!在您发布第一条评论后,我尝试这样做。但是 cl 总是为空(我不知道为什么),所以它创建了一个新的变更日志,我得到了同样的结果——它不会在原始实例中插入数据 复制粘贴了吗?注意 "Changelog" != "ChangeLog" @Fildor 哇,真的吗?!当然是我自己写的-_-如果表单名称错误,您认为它将如何运行?大声笑 @Fildor 不,您不必这样做。我想这只是我。但仍然不知道它怎么会是这样的 好的,修正了 L 的错字。现在应该可以了。除非在第一次单击和第二次单击之间关闭/处置 Changelog 实例以上是关于将数据从一种形式传递到另一种形式(datagridview)的主要内容,如果未能解决你的问题,请参考以下文章
MSoft Access - 将变量从一种形式传递到另一种形式