将参数传递给构造函数c#

时间:2018-01-22 12:09:37

标签: .net datagridview constructor eventhandler

是否可以将参数传递给运行时生成的事件处理程序?以下是创建事件的位置:

private void DataView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            ContextMenuStrip context = new ContextMenuStrip();
            int currentMouseOverRow = DataView.HitTest(e.X, e.Y).RowIndex;
            int row = e.RowIndex;
            int column = e.ColumnIndex;
            if (currentMouseOverRow >= 0)
            {
                int rowsa = e.RowIndex + 1;
                int columnsa = e.ColumnIndex + 1;
                context.Items.Add("Add comment to row: " + rowsa + ", column: " + columnsa);
            }
            context.Show(DataView, new Point(e.RowIndex, e.ColumnIndex));
            context.ItemClicked += new ToolStripItemClickedEventHandler(context_ItemClicked);
        }
    }

我的目标是能够将不可见的dataGridView1中的值提取到用户点击主DataView的匹配x和y坐标

public static void context_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        Form1 frm = Application.OpenForms.OfType<Form1>().Take(1).FirstOrDefault();
        ToolStripItem item = e.ClickedItem;
        if (item.Text == "Add comment")
        {
            DataTable dt3 = frm.ds1.Tables[0];
            frm.DataView.Rows[x].Cells[y].Value = frm.dataGridView1.Rows[x].Cells[y].Value.ToString();
        }
    }

基本上我需要更换&#39; x&#39;并且&#39; y&#39;索引
非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

private ToolStripItemClickedEventHandler GetHandler(int x, int y)
{
    return (sender, e) => {
        Form1 frm = Application.OpenForms.OfType<Form1>().Take(1).FirstOrDefault();
        ToolStripItem item = e.ClickedItem;
        if (item.Text == "Add comment")
        {
            DataTable dt3 = frm.ds1.Tables[0];
            frm.DataView.Rows[x].Cells[y].Value = frm.dataGridView1.Rows[x].Cells[y].Value.ToString();
        }
    }
}

并使用:

context.ItemClicked += GetHandler(42, 8);

或者,你可以在发件人身上使用某种状态(通常是Tag)来保持该状态,然后sender中取出,即

var yourState = (YourState)((Control)sender).Tag;
int x = yourState.X, y = yourState.Y;