我想做的是创建一个 DataGridView 函数库,我可以将其复制并粘贴到程序中。为了简洁起见,所有函数都会将该 DataGridView 引用为 dgv。
就目前情况而言,我必须仔细检查并更改每一段复制的代码以反映当前的 DataGridView 名称。一个明显的解决方案是将每个程序中的 DataGridView 命名为 dgv。
但我真正想做的是,当我引发事件时,从事件内部获取控件。
除了使用 ASP.net control.findcontrol 失败的尝试之外,这是我尝试过的方法。
代码
private void dgvSignals_MouseClick(object sender, MouseEventArgs e)
{
System.Windows.Forms.Control ctrl = sender as System.Windows.Forms.Control;
if (ctrl != null)
{
string name = ctrl.Name;
lstDebug.Items.Add("Control Name: " + name);
System.Windows.Forms.Control parent = (System.Windows.Forms.Control)ctrl.Parent;
string parentName = parent.Name;
lstDebug.Items.Add("Parent name: " + parentName);
Control A = FindControlByName(parent, name);
if (A != null)
{
lstDebug.Items.Add("A.Name: " + A.Name); // I get the correct Name dgvSignals
lstDebug.Items.Add("A.Type: " + A.GetType()); // I get the correct Type dataGridView
}
else
{
lstDebug.Items.Add("Returned Null");
}
dgv_RowDelete(A, 6); // CS1503 Argument 1: cannot convert from 'System.Windows.Forms.Control' to 'System.Windows.Forms.DataGridView'
}
private Control FindControlByName(System.Windows.Forms.Control parent, string name)
{
foreach (Control c in parent.Controls)
{
if (c.Name == name)
return c; //found
}
return null; //not found
}
private bool dgv_RowDelete(DataGridView dgv, int row2Remove)
{
}
我真的有点不知所措。
据我了解,你问题的本质是如何查找和使用控件在没有ASP的情况下使用事件。在Winforms中,获取
FindControlByName
的方法是使用string
集合的Controls
索引器,如下所示。但是,我还注意到您处于 MouseClick
上发生的 dgvSignals
的处理程序中,这意味着 sender
已经是 dgvSignals
。
尽管如此,如果您想通过名称查找此控件或任何其他控件,这非常简单:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
dgvSignals.MouseClick += DgvSignals_MouseClick;
}
private void DgvSignals_MouseClick(object? sender, MouseEventArgs e)
{
if(sender is DataGridView dgv)
{
Debug.Assert(dgv.Name == nameof(dgvSignals), "Expecting sender name is dgvSignals");
// FindForm control by name without ASP
var findByName = Controls[nameof(dgvSignals)] as DataGridView;
Debug.Assert(ReferenceEquals(findByName, dgv), "Expecting these to be the same object");
}
else
{
Debug.Assert(false, "Expecting DataGridView");
}
}
}
Jimi 的评论展示了如何在
dgv
上调用方法(如果您需要这样做作为响应)。