将数据从一种形式传递到另一种形式(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 个表单:AuthorizationChangelog

当用户在授权表单中按下“登录”按钮时,我想将此数据插入到 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)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中将数据从一种形式传递到另一种形式?

MSoft Access - 将变量从一种形式传递到另一种形式

如何将图像从一种形式传递到另一种形式?

从一种形式获取价值并将其传递给另一种形式

如何使用dto和C#窗口形式将信息从一种形式传输到另一种形式?

因为我可以从 jquery 将数据从一种形式发送到另一种形式?