如何获取该控件所在父容器的集合编号? 例如有个Panel1里面有一个TextBox1Panel1.Controls[0]对应的是TextBox1现在如果我知道了TextBox1,有没什么方法可以直接获取它所在父容器的集合编号?也就是整数0 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 只能通过循环找到对象后,才知道该对象的索引private void Form1_Load(object sender, EventArgs e) { Panel p = textBox1.Parent as Panel; if (p != null) { foreach (Control c in p.Controls) { if (c.GetType() == typeof(TextBox)) { TextBox txt = c as TextBox; txt.Text = "Text属性"; //若有多个TextBox对象,可再判断名称 //if (txt.Name == "txtABC") //{ //} } } } } 这个方法不好,(name属性在代码里写是可以重复的)你是先判断类型再判断name属性。但是这两个都可以重复的,所以准确性太低了,而且如果容器多话就不好。。觉得应该有办法可以直接获取的。求高人解答。。 4楼,还是那句准确性太低了。而且用到循环速度效率减低。我觉得Panel1.Controls[0]可以通过下标直接指向控件,控件应该有理由知道它自己下标啊。真的没其它办法了吗? Panel1.Controls[0]可以通过下标直接指向控件,控件应该有理由知道它自己下标啊。真的没其它办法了吗?我所了解的是没有其它办法了。你看构造函数中的InitializeComponent()知道它是怎么一回事了。 当然变向的方法也不是没有,那就是你自已那个类似HashTable一样的东西,然后再InitializeComponent()做相应的管理,那么效率是可以提高的。但与设计器不能同步。 name属性在同一容器同一级同一级别下不允许重复的。你可以试试添加两个TextBox 到Panel 对象中,并设置相同的name,运行时就会报错的。 估计你没看清楚我的话,你是在VS里直接设置Name了。打开Form1.Designer.cs然后展开Windows 窗体设计器生成的代码看看这两个是不是一样的Name?你在VS里直接修改Name当然不行,那个VS直接把对象名字也改和Name一样的。意义不同的。**************** // // textBox1 // this.textBox1.Location = new System.Drawing.Point(20, 34); this.textBox1.Name = "textBox"; this.textBox1.Size = new System.Drawing.Size(100, 21); this.textBox1.TabIndex = 0; // // textBox2 // this.textBox2.Location = new System.Drawing.Point(30, 61); this.textBox2.Name = "textBox"; this.textBox2.Size = new System.Drawing.Size(100, 21); this.textBox2.TabIndex = 4;*****************你说的这么肯定没办法的话我信你。。我觉得直接判断哈希码准确点。。 void GetIndex(TextBox t) { Panel p = t.Parent as Panel; if (p != null) { int i = 0; foreach (Control c in p.Controls) { if (c.Equals(t)) { MessageBox.Show(i.ToString()); } i++; } } } 求助!C#中提交后总是提示失败!急! C# 类的传递的问题 高手速解、、、急啊急啊、、 关于C#调用C++的DLL,这样设计合理吗?安全吗? 关于发布的问题? 首先非常感谢李逍遥昨天解决我了的问题, 我今天还想问一个在PDA里面怎么样获取GPS的信息,很急!!!!!!!!!!!! WinForm中如果让DateGrid的标题行中的文字在垂直方向居中显示? 格式化的字符串如何转化成数组或ArrayList 【求助】VS2010 + DirectJun2010 + C# 运行出错 WPF中Treeview中的节点可以做到下图的样子吗? [Web]如何使用DLL嵌入的资源文件 急急急!!!
{
Panel p = textBox1.Parent as Panel;
if (p != null)
{
foreach (Control c in p.Controls)
{
if (c.GetType() == typeof(TextBox))
{
TextBox txt = c as TextBox;
txt.Text = "Text属性";
//若有多个TextBox对象,可再判断名称
//if (txt.Name == "txtABC")
//{ //}
}
}
}
}
(name属性在代码里写是可以重复的)
你是先判断类型再判断name属性。但是这两个都可以重复的,所以准确性太低了,而且如果容器多话就不好。。觉得应该有办法可以直接获取的。
求高人解答。。
而且用到循环速度效率减低。
我觉得
Panel1.Controls[0]可以通过下标直接指向控件,控件应该有理由知道它自己下标啊。
真的没其它办法了吗?
真的没其它办法了吗?我所了解的是没有其它办法了。
你看构造函数中的InitializeComponent()知道它是怎么一回事了。
但与设计器不能同步。
打开
Form1.Designer.cs
然后展开
Windows 窗体设计器生成的代码
看看这两个是不是一样的Name?
你在VS里直接修改Name当然不行,那个VS直接把对象名字也改和Name一样的。
意义不同的。
****************
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(20, 34);
this.textBox1.Name = "textBox";
this.textBox1.Size = new System.Drawing.Size(100, 21);
this.textBox1.TabIndex = 0;
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(30, 61);
this.textBox2.Name = "textBox";
this.textBox2.Size = new System.Drawing.Size(100, 21);
this.textBox2.TabIndex = 4;
*****************
你说的这么肯定没办法的话我信你。。
我觉得直接判断哈希码准确点。。
void GetIndex(TextBox t)
{
Panel p = t.Parent as Panel;
if (p != null)
{
int i = 0;
foreach (Control c in p.Controls)
{ if (c.Equals(t))
{
MessageBox.Show(i.ToString());
}
i++;
} }
}