.net 在不同的容器中,在其他控件旁边动态显示一个控件

.net 在不同的容器中,在其他控件旁边动态显示一个控件,.net,winforms,.net,Winforms,我在groupbox1上有名为SupplierName和ProductName的文本框,还有一个类似intellisense的gridview1 例如,当我在SupplierName中输入“s”时,gridview1从数据库中获取以“s”开头的客户名称,它动态地位于SupplierName文本框(如intellisense)中当前单词的底部 SupplierName文本框看起来不错,但ProductName文本框位于groupbox1 我无法在groupbox1上找到显示在ProductName

我在
groupbox1
上有名为SupplierName和ProductName的文本框,还有一个类似intellisense的
gridview1

例如,当我在SupplierName中输入“s”时,
gridview1
从数据库中获取以“s”开头的客户名称,它动态地位于SupplierName文本框(如intellisense)中当前单词的底部

SupplierName文本框看起来不错,但ProductName文本框位于
groupbox1
我无法在
groupbox1
上找到显示在ProductName文本框附近的
gridview1
。 即使我在ProductName文本框中输入文本,它也仅显示在SupplierName文本框附近

下面是代码,其中
tb
是文本框参数,该参数采用当前输入文本的文本框名称:

int i=tb.SelectionStart;
...
点pt=tb.GetPositionFromCharIndex(i);
pt.Y+=(int)Math.Ceiling(tb.Font.GetHeight());
pt.Y+=2;
使用(Graphics g=Graphics.FromHwnd(tb.Handle))
{  
SizeF size=g.MeasureString(tb.Text,tb.Font);
如果(size.Width>tb.Width)
{
//浮动长度=大小.宽度%txtintellisense.宽度;
pt.X+=tb.宽度;
}
其他的
pt.X+=(int)size.Width;
}
点=tb.位置;
pt.X+=点X;
点Y+=点Y;
this.dGVinvisible.Location=pt;
这个.dGVinvisible.BringToFront();

产品名称文本框的
位置
相对于GroupBox,但您的代码将其视为相对于表单。您需要通过添加GroupBox坐标来偏移坐标

pt.Offset(groupBox.Location);
this.dGVinvisible.Location = pt;
你可以试试这个

Point point = tb.Location;
Point point0 = GroupBox1.Location;
pt.X += point.X + point0.X;
pt.Y += point.Y + point0.Y;
this.dGVinvisible.Location = pt;

您可以将DGV parent设置为GroupBox1
dGVinvisible.Parent=GroupBox1

@deva。。如果第一个代码对您有效,它会更好。如果选择第二个选项,则应在具有不同容器的控件上的每个GetFocus事件中设置DGV容器。@deva。。如果这对你有帮助的话,请随意投票选择这个答案。。十)