当前位置:编程学习 > C#/ASP.NET >>

字符串类型转换为控件对象问题 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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,