繁体   English   中英

从表单中的UserControl,如何访问父表单的DataGridView?

[英]From a UserControl within a Form, How can I access the DataGridView of the parent Form?

问题:我试图从用户控件( AttachmentOptions.cs )访问我的Windows窗体( ClientSearch.cs )的DataGridView,以便我可以使用它检索的数据。

背景: ClientSearch.cs是一个Windows窗体,可以在我的Outlook加载项的电子邮件中显示。 它允许用户搜索客户端(及其在系统上的相应文件夹)以将电子邮件或附件存档​​到。 AttachmentOptions.cs是为电子邮件中的每个附件生成的用户控件,以便每个附件具有相同的归档选项组。


我已经采取了一些措施来解决这个问题,并且我一直遇到更多问题。 如果情况变得更糟,我会展示我的步骤:

原版的:

var txtClient = parentItem.Controls.Find("txtClient", true); //This works as I want
var dgvClients = parentItem.Controls.Find("dgvClients", true);
DataGridView test = dgvClients; //Error appears on this line
strClientName = test.CurrentRow.Cells[0].Value.ToString();

这是错误:

错误1无法将类型'System.Windows.Forms.Control []'隐式转换为'System.Windows.Forms.DataGridView'


修复尝试1:

var txtClient = parentItem.Controls.Find("txtClient", true);
var dgvClients = (DataGridView)parentItem.Controls.Find("dgvClients", true).Cast<DataGridView>; //Error on this line
DataGridView test = dgvClients;
strClientName = test.CurrentRow.Cells[0].Value.ToString();

错误:

错误20无法将方法组“Cast”转换为非委托类型“System.Windows.Forms.DataGridView”。 你打算调用这个方法吗?


修复尝试2:

var dataGridInfo = parentItem.Controls.Find("dgvClients", true);
var dgvClients = (DataGridView)dataGridInfo; //Error is here
DataGridView test = dgvClients;
strClientName = test.CurrentRow.Cells[0].Value.ToString();

错误:

错误20无法将类型'System.Windows.Forms.Control []'转换为'System.Windows.Forms.DataGridView'


修复尝试3:

var dataGridInfo = parentItem.Controls.Find("dgvClients", true);
DataGridView dgvClients = dataGridInfo.Cast<DataGridView>; //Error is here
DataGridView test = dgvClients;
strClientName = test.CurrentRow.Cells[0].Value.ToString();

错误:

错误20无法将方法组“Cast”转换为非委托类型“System.Windows.Forms.DataGridView”。 你打算调用这个方法吗?


修复尝试4:

        //var dgvClients = parentItem.Controls.Find("dgvClients", true);
        var dataGridInfo = parentItem.Controls.Find("dgvClients", true);
        DataGridView dgvClients;
        dgvClients = (DataGridView)dataGridInfo; //Error is here
        DataGridView test = dgvClients;
        strClientName = test.CurrentRow.Cells[0].Value.ToString();

错误:

错误20无法将类型'System.Windows.Forms.Control []'转换为'System.Windows.Forms.DataGridView'


在我试图与DataGridView交谈时,我觉得我正在绕圈并且恶化我的代码(因此为什么我展示了以前的版本)。 似乎c#不喜欢将这两种类型转换在一起,所以有另一种方式来引用DataGridView对象吗?

作为参考, parentItem引用先前声明的ClientSearch ,这适用于与ClientSearch.cs ,例如文本框。

非常感谢您的时间和帮助

错误就在那里,盯着你看。

回到原始代码。 您正从Controls.Find()获取一个数组,并试图将其视为单个对象。 您可能想要该数组中的第一项,假设您知道其中只有一项。

var txtClient = parentItem.Controls.Find("txtClient", true);
var dgvClients = parentItem.Controls.Find("dgvClients", true);
DataGridView test = dgvClients[0] as DataGridView;
strClientName = test.CurrentRow.Cells[0].Value.ToString();

UserControl父表单中按名称查找控件真的是个坏主意。

相反,您应该为UserControl创建DataGridView类型的属性,并使用代码或设计器分配它,并在UserControl使用它。

public DataGridView ClientsGrid { get; set; }

您不依赖于命名约定,而是依赖于开发人员的选择。

所以你有多个问题,让我们解决它们:

  1. Find返回一组控件:

要解决这个问题,您需要从中获取第一个项目:

var dgvClients = parentItem.Controls.Find("dgvClients", true)
                                    .FirstOrDefault() as DataGridView;
  1. Cast是一种方法:

调用方法时,需要使用paranthesis ()

.Cast<DataGridView>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM