求救:一个返回TextBox的方法

lonyjianhui 2011-08-15 04:28:39
主窗体有100个TextBox,命名分别为textBox1,textBox2,textBox3......textBox100
我现在想用一个途径返回窗体中的TextBox控件,参数为int类型,
private TextBox F(int i)
{
//利用参数i返回主窗体的TextBox控件,如参数为2,则返回textBox2,参数为99,则返回textBox99
}

大家帮忙想想,有什么办法可以做到,或者在上面的方法里面怎么写,要效率的,别跟我说写什么
swich(i)
{
case 1:
retrun textBox1;
}

之类的,这种写法那个效率没得说
另外,如果我的思路是错误的,希望大家指正。
...全文
239 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
stonemqy 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cnwin 的回复:]
你的看要干什么了。其实这多个TextBox可以共享事件处理过程的。只是Sender的名字不一样罢了。
例如TextChanged事件里你完全可以((TextBox)Sender).Name
[/Quote]

正解!
没有必要再去找空间,麻烦的。
lonyjianhui 2011-08-26
  • 打赏
  • 举报
回复
其实不是100个,是128个,懒得上传图片,就不发了,刚刚完成,上头挺满意的,其他的不想讨论了,结贴了[Quote=引用 26 楼 qazwsx9288 的回复:]
很像看看界面是什么样子的
[/Quote]
lonyjianhui 2011-08-26
  • 打赏
  • 举报
回复
刚刚搞清楚了,Control.Find跟我写的作用差不多的,都是反射,不是遍历[Quote=引用 28 楼 sp951 的回复:]
Find()
是遍历
Controls[i].Name == key ?
这比反射要快。
private Control Find(int i)
{
string key = "TextBox" + i.ToString();
for(int i = 0; i < this.Controls.Count; i++)
{
if(this.Controls.Name……
[/Quote]
sp951 2011-08-26
  • 打赏
  • 举报
回复
Find()
是遍历
Controls[i].Name == key ?
这比反射要快。
private Control Find(int i)
{
string key = "TextBox" + i.ToString();
for(int i = 0; i < this.Controls.Count; i++)
{
if(this.Controls.Name.Equals.Equals(key))
{
return this.Controls[i];
}
}

return null;
}
kidong 2011-08-25
  • 打赏
  • 举报
回复
赞成9楼的
qazwsx9288 2011-08-25
  • 打赏
  • 举报
回复
很像看看界面是什么样子的
ZhangNan20100811 2011-08-25
  • 打赏
  • 举报
回复
一百个TEXTBOX...? mark!
lonyjianhui 2011-08-25
  • 打赏
  • 举报
回复
大哥,偶来是求知识,求原理,求真相的,不是求贬的,你懂得原理就说出来嘛,为什么不能用反射,最后用PropertyDescriptorCollection.Find跟Controls.Find这我知道有点傻,但是用反射就必须用到这个呀,就效率来说,为什么不能谈嘛,都是找到控件再设属性值嘛,他们的效率到底差在哪里?请赐教[Quote=引用 23 楼 keenw 的回复:]
一个查找还用上反射,最终还是用料Find方法,还谈效率,额的个神
[/Quote]
程序猿CKeen 2011-08-22
  • 打赏
  • 举报
回复
一个查找还用上反射,最终还是用料Find方法,还谈效率,额的个神
lonyjianhui 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sugarbelle 的回复:]
控件倒是不多...但方法他们都说出来了..没有其他方法了吧.
要不你用字典把控件和id绑起来.
查的时候直接查id返回控件.
[/Quote]
这位老兄,我知道Control.Find可以完成,但最后我还是没用它,我自己用反射定义了一个方法,但是我说不清楚两者的区别,能否赐教一下?
/// <summary>
/// 根据控件名和属性名赋值,并返回控件实例
/// </summary>
/// <param name="ClassInstance">控件所在实例</param>
/// <param name="ControlName">控件名</param>
/// <param name="PropertyName">属性名</param>
/// <param name="Value">属性值</param>
/// <returns>控件实例</returns>
public static Object SetValueControlProperty(Object ClassInstance, string ControlName, string PropertyName, Object Value)
{
Object Result = null;

Type myType = ClassInstance.GetType();

FieldInfo myFieldInfo = myType.GetField(ControlName, BindingFlags.NonPublic | BindingFlags.Instance);
if (myFieldInfo != null)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(myFieldInfo.FieldType);

PropertyDescriptor myProperty = properties.Find(PropertyName, false);
if (myProperty != null)
{
Object ctr;

ctr = myFieldInfo.GetValue(ClassInstance); //取得控件实例

try
{
myProperty.SetValue(ctr, Value);

Result = ctr;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
return Result;
}
极地_雪狼 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dalmeeme 的回复:]
只要一句就可以了:
return this.Controls.Find("textBox"+i.ToString(), false)[0];
[/Quote]
+1
sugarbelle 2011-08-22
  • 打赏
  • 举报
回复
(TextBox)Sender 他说的是返回事件触发者.
返回触发这个TextChanged事件的textbox.并不是你要的查id返回textbox
sugarbelle 2011-08-22
  • 打赏
  • 举报
回复
控件倒是不多...但方法他们都说出来了..没有其他方法了吧.
要不你用字典把控件和id绑起来.
查的时候直接查id返回控件.
lonyjianhui 2011-08-22
  • 打赏
  • 举报
回复
这位老兄倒是有点技术,能提示下老弟如何共享么?[Quote=引用 12 楼 cnwin 的回复:]
你的看要干什么了。其实这多个TextBox可以共享事件处理过程的。只是Sender的名字不一样罢了。
例如TextChanged事件里你完全可以((TextBox)Sender).Name
[/Quote]
lonyjianhui 2011-08-22
  • 打赏
  • 举报
回复
就有128项指标要测试的,而且每次测试每个指标都要求实时反应给用户[Quote=引用 15 楼 soloboy1020 的回复:]
Textbox多了點吧... 什麼介面啊
[/Quote]
lonyjianhui 2011-08-22
  • 打赏
  • 举报
回复
第一,同13楼;第二,有些软件是技术人员专用的,由于功能要求,是无法减少太多控件的,就比如excel一样,也是一大堆格子,能说它不友好么[Quote=引用 7 楼 gugia 的回复:]
1楼说到要害
[/Quote]
Soloboy1020 2011-08-22
  • 打赏
  • 举报
回复
Textbox多了點吧... 什麼介面啊
lonyjianhui 2011-08-22
  • 打赏
  • 举报
回复
算你牛,说过不要这种笨方法,你脸皮够厚的[Quote=引用 2 楼 taomanman 的回复:]
C# code

foreach (System.Windows.Forms.Control control in this.Controls)//遍历Form上的所有控件
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.T……
[/Quote]
lonyjianhui 2011-08-22
  • 打赏
  • 举报
回复
可以的,友好界面靠的是技术,而不是控件多少[Quote=引用 1 楼 gomoku 的回复:]
主窗体有100个TextBox?

这样的界面能用户友好吗?
[/Quote]
cnwin 2011-08-16
  • 打赏
  • 举报
回复
你的看要干什么了。其实这多个TextBox可以共享事件处理过程的。只是Sender的名字不一样罢了。
例如TextChanged事件里你完全可以((TextBox)Sender).Name
加载更多回复(11)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧