字符串类型转换为控件对象问题 C#
个位大虾好:一个问题,一个控件的text属性被我从数据库中取出。但取出来的是string
这个控件可能是button,lable,textbox。
请问,我取出来的这个string如何去转换成控件对象。
然后直接 .text 就可以直接赋值。
如 转换后 ×××.text = "123";
×××.Font = myFont();
在线等,本人用的是vs2003。 急急急急急急急急 --------------------编程问答-------------------- 反射 --------------------编程问答-------------------- string如何去转换成控件对象 ?不会哦!! --------------------编程问答-------------------- 存数据库的时候,是怎么对应控件的,肯定有标记吧? --------------------编程问答-------------------- 标记?如何标记?存入数据库的时候只存了控件名作为标示。 --------------------编程问答-------------------- string如何去转换成控件对象?是对象名字吧? --------------------编程问答-------------------- 对象名?转换为对象名后可以直接点出属性吗?
--------------------编程问答-------------------- 只能是反射了
MSDN:
-------------------------------------------------------
反射提供了由语言编译器(例如 Microsoft Visual Basic .NET 和 JScript)用来实现隐式晚期绑定的基础结构。绑定是查找与唯一指定的类型相对应的声明(即实现)的过程。由于此过程在运行时而不是在编译时发生,所以称作晚期绑定。Visual Basic .NET 允许您在代码中使用隐式的晚期绑定;Visual Basic 编译器将调用一个帮助器方法,该方法使用反射来获取对象类型。传递给帮助器方法的参数有助于在运行时调用正确的方法。这些参数包括:对其调用方法的实例(对象),被调用方法的名称(字符串),以及传递给被调用方法的参数(对象数组)。
在以下示例中,Visual Basic 编译器使用反射隐式地对其类型在编译时未知的对象调用方法。HelloWorld 类具有一个 PrintHello 方法,它输出与传递给 PrintHello 方法的某些文本串联的“Hello World”。在该示例中调用的 PrintHello 方法实际上是 Type.InvokeMember;Visual Basic 代码允许按照对象 (helloObj) 的类型在编译时已知(早期绑定)而不是在运行时已知(晚期绑定)的方式来调用 PrintHello 方法。
[Visual Basic]
Imports System
Module Hello
Sub Main()
' Sets up the variable.
Dim helloObj As Object
' Creates the object.
helloObj = new HelloWorld()
' Invokes the print method as if it was early bound
' even though it is really late bound.
helloObj.PrintHello("Visual Basic Late Bound")
End Sub
End Module
自定义绑定
除了由编译器隐式地用来进行晚期绑定之外,反射还可以在代码中显式地用来完成晚期绑定。
公共语言运行库支持多种编程语言,但这些语言的绑定规则各不相同。在早期绑定的情况下,代码生成器可以完全控制此绑定。但是,当通过反射进行晚期绑定时,必须用自定义绑定来控制绑定。Binder 类提供了对成员选择和调用的自定义控制。
利用自定义绑定,您可以在运行时加载程序集,获取有关该程序集中类型的信息,然后对该类型调用方法或访问该类型的字段或属性。如果您在编译时(例如当对象类型依赖于用户输入时)不知道对象的类型,就可以使用这种方法。
以下示例说明不提供参数类型转换的简单的自定义联编程序。Simple_Type.dll 的代码位于示例主体之前。确保生成 Simple_Type.dll,然后在生成时在项目中包括对 Simple_Type.dll 的引用。
public class CustomBinderDriver
{
public static void Main (string[] arguments)
{
Type t = typeof (CustomBinderDriver);
CustomBinder binder = new CustomBinder();
BindingFlags flags = BindingFlags.InvokeMethod|BindingFlags.Instance|
BindingFlags.Public|BindingFlags.Static;
// Case 1. Neither argument coercion nor member selection is needed.
args = new Object[] {};
t.InvokeMember ("PrintBob", flags, binder, null, args);
// Case 2. Only member selection is needed.
args = new Object[] {42};
t.InvokeMember ("PrintValue", flags, binder, null, args);
// Case 3. Only argument coercion is needed.
args = new Object[] {"5.5"};
t.InvokeMember ("PrintNumber", flags, binder, null, args);
}
public static void PrintBob ()
{
Console.WriteLine ("PrintBob");
}
public static void PrintValue (long value)
{
Console.WriteLine ("PrintValue ({0})", value);
}
public static void PrintValue (String value)
{
Console.WriteLine ("PrintValue\"{0}\")", value);
}
public static void PrintNumber (double value)
{
Console.WriteLine ("PrintNumber ({0})", value);
}
}
--------------------编程问答-------------------- ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpcondynamicallyloadingusingtypes.htm --------------------编程问答-------------------- 能给出个具体的代码吗? --------------------编程问答-------------------- 你应该不是用代码自动成控件把?
只是想用个Control 转换一下吧?
Control ct=用循环遍历或者用参数传入的各类控件(button,textbox,label
ct.Text = 数据库读取的数据;
不知道是不是这样?
就算自动生成控件的 那你也要指定到底是啥控件才行吧,道理都一样的。 --------------------编程问答-------------------- 问题未解决,但还是谢谢个位了。 --------------------编程问答-------------------- Control[] ctr;
ctr = form对象.Controls.Find("字符串", true); --------------------编程问答-------------------- 楼主是不是想根据记录生成页面呀.
最好别这样做.
接点分.. --------------------编程问答-------------------- System.Reflection --------------------编程问答-------------------- ListBox LX = (ListBox)Page.FindControl("ListBox"+i); --------------------编程问答-------------------- 看了一下.原来WEB也很简单:
for (int i = 1; i <= 3; i++)
{
((Label)Page.FindControl("Label" + i)).Text = "xxx";
} --------------------编程问答-------------------- 哈哈.跟错贴子了. --------------------编程问答-------------------- 直接使用事件里的 sender 即可。。。 --------------------编程问答-------------------- 使用接口 可以减少很多控件类型判断
我用过的代码
如:ListControl就有 DropDownlist RadioButtionList CheckBoxList 等等 一个接口就搞定了
如果自己定控件 也可以实现对应接口 这个程序基本可以通用
--------------------编程问答-------------------- 这个问题也困扰了我很久了
/// <summary>
/// 设置单个控件值
/// </summary>
/// <param name="controlID"></param>
/// <param name="ftype"></param>
/// <param name="value"></param>
public void SetControlValue(string fieldName, object[] value)
{
if (value == null || value.Length < 1)
value = new string[1] { String.Empty };
for (int i = 0; i < value.Length; i++)
{
if (value[i] == null)
value[i] = String.Empty;
}
Control cl = this.FindControl(fieldName);
EditField efield = TheForm.GetEditField(fieldName);
if (cl == null || efield == null)
throw new Exception("Can't find control:" + fieldName);
if (cl is ListControl)
{
bool selected = false;
bool finded = false;
foreach (ListItem it in ((ListControl)cl).Items)
{
foreach (object s in value)
{
String valueString = FormatedString(s, efield.StringFormat);
if (valueString.Trim().ToLower() == it.Value.ToLower().Trim())
{
finded = true;
it.Selected = true;
break;
}
else
{
it.Selected = false;
}
}
DropDownList ddl = cl as DropDownList;
RadioButtonList rbl = cl as RadioButtonList;
if ((ddl != null || rbl != null) && selected && it.Selected)//如果是DropDownList则不能多选
{
it.Selected = false;
}
if (finded)
selected = true;
}
return;
}
if (cl is FredCK.FCKeditorV2.FCKeditor)
{
((FredCK.FCKeditorV2.FCKeditor)cl).Value = value[0].ToString();
return;
}
if (cl is ITextControl)
{
String valueString = FormatedString(value[0], efield.StringFormat);
ITextControl tb = (ITextControl)cl;
tb.Text = valueString;
ICheckBoxControl icc = cl as ICheckBoxControl;
if (icc != null)
{
if (tb.Text.ToLower().Trim() == valueString.ToLower().Trim())
icc.Checked = true;
}
}
if (cl is ICtrlValue)//这是我自己定义的控件接口
{
if (value != null && value.Length == 1)
((ICtrlValue)cl).CtrlValue = ((Array)value).GetValue(0);
else
((ICtrlValue)cl).CtrlValue = value;
}
}
//获取一个控件的值
public String GetControlValueString(string fieldName)
{
Control cl = this.FindControl(fieldName);
if (cl == null)
{
return string.Empty;
}
// throw new Exception("Can't find control:" + fieldName);
if (cl is ListControl)
{
ListControl lcl = (ListControl)cl;
if (lcl.SelectedIndex != -1)
{
return lcl.SelectedValue;
}
else
{
return String.Empty;
}
}
else if (cl is ITextControl)
{
if (cl is ICheckBoxControl) //这里如果是 checkBox
{
if (((ICheckBoxControl)cl).Checked)
{
return ((ITextControl)cl).Text;
}
else
{
return String.Empty;
}
}
else
{
ITextControl itc = (ITextControl)cl;
itc.Text = itc.Text.Trim();
return itc.Text;
}
}
else if (cl is FredCK.FCKeditorV2.FCKeditor)
{
return ((FredCK.FCKeditorV2.FCKeditor)cl).Value;
}
return String.Empty;
}
补充:.NET技术 , .NET Framework