问题:我正在尝试从用户控件(ClientSearch.cs
)访问我的Windows窗体(AttachmentOptions.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
与文本框等内容交谈。
非常感谢你的时间和帮助
答案 0 :(得分:2)
错误就在那里,盯着你看。
返回原始代码。您正从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();
答案 1 :(得分:1)
以UserControl
的父母形式按名称查找控件真是个坏主意。
相反,您应为DataGridView
创建UserControl
类型的属性,并使用代码或设计器进行分配,并在UserControl
中使用它。
public DataGridView ClientsGrid { get; set; }
您不依赖于命名约定,而是依赖于开发人员的选择。
答案 2 :(得分:0)
所以你有多个问题,让我们解决它们:
要解决这个问题,你需要抓住第一个项目:
var dgvClients = parentItem.Controls.Find("dgvClients", true)
.FirstOrDefault() as DataGridView;
调用方法时,需要使用paranthesis ()
:
.Cast<DataGridView>();