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;