尝试在不使用 ASP 的情况下使用事件查找和使用控件

问题描述 投票:0回答:1

我想做的是创建一个 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)
    {
    }

我真的有点不知所措。

c# winforms events controls
1个回答
0
投票

据我了解,你问题的本质是如何查找和使用控件在没有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
上调用方法(如果您需要这样做作为响应)。

© www.soinside.com 2019 - 2024. All rights reserved.