Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使动态创建的对象';的事件处理程序引用另一个类中的DGV对象?_C#_.net_Datagridview - Fatal编程技术网

C# 如何使动态创建的对象';的事件处理程序引用另一个类中的DGV对象?

C# 如何使动态创建的对象';的事件处理程序引用另一个类中的DGV对象?,c#,.net,datagridview,C#,.net,Datagridview,我创建了一个类dgvRoll,用于为运行时分配给Form1的DataGridView控件编写动态方法。我还向DGV添加了一个滑动控件,并将其安装到一个单元格中。在此处找到视觉参考: 问题是,我需要滑块控件的事件处理程序(或运行时添加到DGV的任何通用控件)与datagridview通信。这方面的一个速记示例如下: class dgvRoll { public void Loader(DataGridView dataGridView1) { // REMOVED

我创建了一个类
dgvRoll
,用于为运行时分配给Form1的DataGridView控件编写动态方法。我还向DGV添加了一个滑动控件,并将其安装到一个单元格中。在此处找到视觉参考:

问题是,我需要滑块控件的事件处理程序(或运行时添加到DGV的任何通用控件)与datagridview通信。这方面的一个速记示例如下:

class dgvRoll
{
    public void Loader(DataGridView dataGridView1)
    {
        // REMOVED IRRELEVANT CODE FROM LOADER METHOD
        Dynamic_CTRLs(dataGridView1);
    }

    public void Dynamic_CTRLs(DataGridView dataGridView1)
    {
        Counter = 0; // SET TO ZERO FOR SIMPLICITY
        var sldrCtrl = new RangeSlider();
        sldrCtrl.Name = "sldr" + Counter;

        // ADD CONTROL
        dataGridView1.Controls.Add(sldrCtrl);

        // ADD EVENT HANDLER
        sldrCtrl.Click += new EventHandler(sldrCrtl_Click);
    }

    /* 
主要问题是:我需要DATAGRIDVIEW1引用FORM1中的DGV 与创建新DGV相反。我尝试将DGV对象作为附加参数传递 在CLICK事件中,但处理程序将无法识别它。 */

以下是在Form1中将dgv类分配给dataGridView1的代码:

public partial class Form1 : Form
{
    // DGV OBJECT
    DataGridView dataGridView1 = new DataGridView();

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        // ASSIGN DGV LOAD METHOD
        dataGridView1.Parent = this.tabCtrl.TabPages[0];
        dataGridView1.Dock = DockStyle.Fill;

        dgvRoll dgv = new dgvRoll();
        dgv.Loader(this.dataGridView1);
    }
}

感谢您的关注和任何有用的建议

如果愿意,可以在Dynamic_CTRLs方法中将DataGridView指定给RangeSloider的Tag属性,如下所示:

var sldrCtrl = new RangeSlider();
sldrCtrl.Name = "sldr" + Counter;
sldrCtrl.Tag = dataGridView1;//   <-------look here

您可以对任何控件执行此操作,只要它是从控件类派生的。

正确,
DataGridView dataGridView1=newdatagridview()不起作用,因为它是“新的”,而不是屏幕上的控件。您可以尝试修改RangeSloider类以保存对网格控件的引用,并通过构造函数传递网格控件,在构造函数中,您将拥有
var sldrCtrl=new RangeSloider(dataGridView1)这是有效的。谢谢这是你唯一知道的方式吗?此外,标记属性可以引用多个对象吗?当然还有其他方法,但要完全按照您的要求(将dgv传递到事件处理程序中),我认为这是最简单的方法。tag属性只能引用单个“对象”,但该对象可以是列表(如列表)或集合,也可以是包含对其他对象的多个引用的类,等等。。。只要您知道事件处理程序中的预期内容。顺便说一句,您可能应该在行(datagridview=(datagridview)sldrCtrl.Tag)周围进行检查,以确保您确实拥有datagridview。如果为null或其他类型的对象,您可能会遇到运行时错误。另一种方法是为控件创建包装类,然后创建自定义EventArgs类,添加您想要/需要的内容。。。这将需要更多的文字,然后是允许在这些评论中解释,但如果你想做的研究,这并不难。也许是杀伤力太大了。
var sldrCtrl = new RangeSlider();
sldrCtrl.Name = "sldr" + Counter;
sldrCtrl.Tag = dataGridView1;//   <-------look here
RangeSlider sldrCtrl = (RangeSlider)sender;
DataGridView dataGridView1 = (DataGridView)sldrCtrl.Tag;