还有个问题,请大家帮帮忙,谢谢了。大家都有分

时间:2021-07-18 20:47:50
我窗体上有40个groupbox,每个gb用得是相同的contextMenu,选择cm中得一项弹出个窗口,然后在窗

口中的txt赋值后传回父窗体,再把值赋给gb中的lb,当我鼠标右击时,我怎么判断点击的是哪个gb

呢,要知道是点击得哪个gb我才能把gb中的lb赋值啊。

12 个解决方案

#1


click中有个sender参数,就是你click中的gb

#2


你把这个sender强制转换为gb,然后就可以使用了...

#3


请问我要怎么强制转换呢
private void menuItem1_Click(object sender, System.EventArgs e)
{
    Form2 fr=new Form2();
    if(fr.ShowDialog()==DialogResult.OK)
    {
SortedList sl=fr.get_sl;
foreach(Control c in this.Controls)
{
    if( c is GroupBox )
    {
        就是在这里判断点击得是哪个gb,怎么判断啊
    }
}
    }
}

#4


我这样改了,可是转换错误,报“指定的转换无效”
Form2 fr=new Form2();
if(fr.ShowDialog()==DialogResult.OK)
{
SortedList sl=fr.get_sl;
GroupBox gb=(GroupBox)sender;//这里错了
this.selectControl(gb,sl);
}

#5


用GroupBox gb=sender as GroupBox;

#6


谢谢楼上几位朋友
现在是转换成功了,但是无法用转换后gb的属性。
我得界面上有40个gb,我是想右键点击一个得时候,能判断点击得是哪个gb,然后在把gb中得lb得text赋值,转换后又怎么做了,谢谢

#7


GroupBox gb=(GroupBox)sender;
switch(gb.name)
不只可以不

#8


GroupBox gb=(GroupBox)sender;这样转换错误

转换后是新的gb,连名字都没有

#9


谢谢大家,问题解决了
this.contextMenu1.SourceControl;
这样可以获得是哪个控件弹出的菜单。

#10


楼上的做法统统不行,因为:System.Window.Forms.GroupBox gb = sender as GroupBox;
这个时候得到的gb是个空类型,也就是说sender = MenuItem 。


我的做法是这样的:在弹出右键菜单之前保存了当前鼠标的坐标,然后当另一个窗口关闭后,再用原来保存的坐标来判断是在哪个GroupBox中。再改掉它的Text。

public string _strlb;  //从另一个窗口传过来的TEXT

[DllImport("user32.dll", EntryPoint="GetCursorPos")]
public static extern int GetCursorPos (
ref System.Drawing.Point lpPoint
);

[DllImport("user32.dll", EntryPoint="PtInRect")]
public static extern bool PtInRect (
ref System.Drawing.Rectangle lpRect,
int ptX,
int ptY
);

private void menuItem1_Click(object sender, System.EventArgs e)
{
Point mpt = new Point();
GetCursorPos(ref mpt); //保存当前鼠标的坐标

Form2 f2 = new Form2(this as Form1);
f2.ShowDialog();

System.Drawing.Rectangle rect = new Rectangle();;

foreach(System.Windows.Forms.Control ctl in this.Controls)
{
rect = System.Windows.Forms.Screen.GetWorkingArea(ctl);

if (ctl is System.Windows.Forms.GroupBox)
{
if (PtInRect(ref rect,mpt.X,mpt.Y))  //判断当时弹出右键菜单时的坐标在哪个GroupBox里。
{
ctl.Text = _strlb;
break;
}
}
}
}

但是这样做还有一个问题没有修改,就是永远只能改掉同一个GroupBox的Text。主要是判断点是否在控件内有问题,所以我把它提出来,也希望高手帮我改一下。

#11


我已经解决了,就是用this.contextMenu1.SourceControl

#12


楼主,我晕呀,我想尽了办法,你最后来一句cm.SourceControl解决了,哎。。。无语。。

#1


click中有个sender参数,就是你click中的gb

#2


你把这个sender强制转换为gb,然后就可以使用了...

#3


请问我要怎么强制转换呢
private void menuItem1_Click(object sender, System.EventArgs e)
{
    Form2 fr=new Form2();
    if(fr.ShowDialog()==DialogResult.OK)
    {
SortedList sl=fr.get_sl;
foreach(Control c in this.Controls)
{
    if( c is GroupBox )
    {
        就是在这里判断点击得是哪个gb,怎么判断啊
    }
}
    }
}

#4


我这样改了,可是转换错误,报“指定的转换无效”
Form2 fr=new Form2();
if(fr.ShowDialog()==DialogResult.OK)
{
SortedList sl=fr.get_sl;
GroupBox gb=(GroupBox)sender;//这里错了
this.selectControl(gb,sl);
}

#5


用GroupBox gb=sender as GroupBox;

#6


谢谢楼上几位朋友
现在是转换成功了,但是无法用转换后gb的属性。
我得界面上有40个gb,我是想右键点击一个得时候,能判断点击得是哪个gb,然后在把gb中得lb得text赋值,转换后又怎么做了,谢谢

#7


GroupBox gb=(GroupBox)sender;
switch(gb.name)
不只可以不

#8


GroupBox gb=(GroupBox)sender;这样转换错误

转换后是新的gb,连名字都没有

#9


谢谢大家,问题解决了
this.contextMenu1.SourceControl;
这样可以获得是哪个控件弹出的菜单。

#10


楼上的做法统统不行,因为:System.Window.Forms.GroupBox gb = sender as GroupBox;
这个时候得到的gb是个空类型,也就是说sender = MenuItem 。


我的做法是这样的:在弹出右键菜单之前保存了当前鼠标的坐标,然后当另一个窗口关闭后,再用原来保存的坐标来判断是在哪个GroupBox中。再改掉它的Text。

public string _strlb;  //从另一个窗口传过来的TEXT

[DllImport("user32.dll", EntryPoint="GetCursorPos")]
public static extern int GetCursorPos (
ref System.Drawing.Point lpPoint
);

[DllImport("user32.dll", EntryPoint="PtInRect")]
public static extern bool PtInRect (
ref System.Drawing.Rectangle lpRect,
int ptX,
int ptY
);

private void menuItem1_Click(object sender, System.EventArgs e)
{
Point mpt = new Point();
GetCursorPos(ref mpt); //保存当前鼠标的坐标

Form2 f2 = new Form2(this as Form1);
f2.ShowDialog();

System.Drawing.Rectangle rect = new Rectangle();;

foreach(System.Windows.Forms.Control ctl in this.Controls)
{
rect = System.Windows.Forms.Screen.GetWorkingArea(ctl);

if (ctl is System.Windows.Forms.GroupBox)
{
if (PtInRect(ref rect,mpt.X,mpt.Y))  //判断当时弹出右键菜单时的坐标在哪个GroupBox里。
{
ctl.Text = _strlb;
break;
}
}
}
}

但是这样做还有一个问题没有修改,就是永远只能改掉同一个GroupBox的Text。主要是判断点是否在控件内有问题,所以我把它提出来,也希望高手帮我改一下。

#11


我已经解决了,就是用this.contextMenu1.SourceControl

#12


楼主,我晕呀,我想尽了办法,你最后来一句cm.SourceControl解决了,哎。。。无语。。