C# TypeConverter 使用的急紧问题,注释一定要,越详细越好,顶者有分!!

Jave.Lin 2009-09-17 12:51:06
如题。

在网上下载到的某些源码有用到TypeConverter 的,但不会用啊。

MSDN翻译说得不好理解。

最好哪位大哥源码+注释(详细)的说明一下,感激不尽!!

...全文
756 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyxiaoyao 2009-10-29
  • 打赏
  • 举报
回复
http://www.cnblogs.com/light169/archive/2007/03/25/686978.html

看这个吧,写得不错..
yutian_01261027 2009-09-17
  • 打赏
  • 举报
回复
UP
纸纸纸纸飞飞 2009-09-17
  • 打赏
  • 举报
回复
不懂,关注中。。
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
如果是你的代码,那在属性窗口里无法设置那几个属性。因为,原来的代码把类封在类里了。改了下
using System;
using System.Collections.Generic;
using System.ComponentModel;

using System.Data;

using System.Text;
using System.Windows.Forms;
using System.ComponentModel.Design.Serialization;
using System.Reflection;


namespace MyControls
{
public partial class TextBox_Algorithm : TextBox
{


protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool result = FilterInputKeys(keyData);
if (result)
return result;
//return true;
//MessageBox.Show(keyData.ToString());
return base.ProcessCmdKey(ref msg, keyData); ;

}


private bool FilterInputKeys(Keys keyData)
{
bool tag = false;
//Code here
if (SetPermissionKeys.Enable)
{
if (SetPermissionKeys.SetThePermission == SetPermisstion.AllowThePermisstionKeys)
{
//AllowThePermisstionKeys
if (SetPermissionKeys.ThePermissionKeys.Contains(keyData))
{
tag = false;
}
else
{
tag = true;
}
return tag;
}
if (SetPermissionKeys.SetThePermission == SetPermisstion.NotAllowThePermissionKeys)
{
//NotAllowThePermisstionKeys
if (SetPermissionKeys.ThePermissionKeys.Contains(keyData))
{
tag = true;
}
else
{
tag = false;
}
return tag;
}
}
return tag;
}



private PermissionKeys _setPermissionKeys = new PermissionKeys();

public PermissionKeys SetPermissionKeys
{
get { return _setPermissionKeys; }
set { _setPermissionKeys = value; }
}


}
public class MyConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(PermissionKeys)) return true;

return base.CanConvertFrom(context, sourceType);
}


public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(PermissionKeys)) return true;

if (destinationType == typeof(InstanceDescriptor)) return true;

return base.CanConvertTo(context, destinationType);
}

public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
PermissionKeys result = new PermissionKeys();
if (destinationType == typeof(PermissionKeys))
{
PermissionKeys permissionKeys = (PermissionKeys)value;
//result = permissionKeys.Min.ToString() + "," + permissionKeys.Max.ToString() + "," + permissionKeys.Sex.ToString();
result = new PermissionKeys();

return result;

}

if (destinationType == typeof(InstanceDescriptor))
{
ConstructorInfo ci = typeof(PermissionKeys).GetConstructor(new Type[] { typeof(List<Keys>), typeof(SetPermisstion), typeof(bool) });
PermissionKeys permissionKeys = (PermissionKeys)value;

return new InstanceDescriptor(ci, new object[] { permissionKeys.ThePermissionKeys, permissionKeys.SetThePermission, permissionKeys.Enable });
}
return base.ConvertTo(context, culture, value, destinationType);
}

public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is PermissionKeys)
{
PermissionKeys pk = new PermissionKeys();
return pk;
}
return base.ConvertFrom(context, culture, value);
}

public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}

public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
return TypeDescriptor.GetProperties(typeof(PermissionKeys), attributes);
}
}
[TypeConverter(typeof(MyConverter))]
public class PermissionKeys
{
public PermissionKeys()
{
}

private List<Keys> _thePermissionKeys = new List<Keys>();

public List<Keys> ThePermissionKeys
{
get { return _thePermissionKeys; }
set { _thePermissionKeys = value; }
}

private SetPermisstion _setThePermission;

public SetPermisstion SetThePermission
{
get { return _setThePermission; }
set
{
if (!TypeDescriptor.GetConverter(typeof(SetPermisstion)).IsValid(value))
{
throw new ArgumentException();
}

_setThePermission = value;
}
}

private bool _enable;

public bool Enable
{
get { return _enable; }
set { _enable = value; }
}
}

/// <summary>
/// 设置限制模式
/// </summary>
public enum SetPermisstion
{
/// <summary>
/// 只允许已限制功能键的集合
/// </summary>
AllowThePermisstionKeys = 0,
/// <summary>
/// 禁止已限制功能键的集合
/// </summary>
NotAllowThePermissionKeys = 1
}

}
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 linjf520 的回复:]
引用 12 楼 ncjcz 的回复:
引用 11 楼 linjf520 的回复:
引用 7 楼 ncjcz 的回复:
我用的不是2008,是2005
去掉
using System.Linq;

    public TextBox_Algorithm()
        {
            InitializeComponent();
        }

编译后,一切正常


我之前都说了,编译是没事,运行就会有问题。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,这时,回到“查看代码”就会出现我上述的错误图片说明。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,按F5运行,也会这样,我说的是运行,不是IDE的编译。

没问题,把这个控件封装到一个类库,然后我在另一个应用程序里用,很正常


不会吧。。。。。

怎么可能。

我在我这里会弹出如我上述的图片错误问题。

那是因为我对TypeConverter改动过,因为对参数不了解,所以有些条件我都可以改错了。

怎么你的没问题。。。。这不可能,除非你自己改过什么了?

using System.Linq;估计不是这个问题。我这些都没有用到Linq的东西。
[/Quote]

恩,你的图片看不到(你说的办法也看不到)
改过?我没改代码,直接用1楼的代码生成的。
private void Form6_Load(object sender, EventArgs e)
{
this.textBox_Algorithm1.SetPermissionKeys.Enable = true;
this.textBox_Algorithm1.SetPermissionKeys.SetThePermission = MyControls.TextBox_Algorithm.SetPermisstion.AllowThePermisstionKeys;
List<Keys> mask = new List<Keys>();
mask.Add(Keys.A);
this.textBox_Algorithm1.SetPermissionKeys.ThePermissionKeys = mask;
}
你怎么改的?
Jave.Lin 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ncjcz 的回复:]
引用 11 楼 linjf520 的回复:
引用 7 楼 ncjcz 的回复:
我用的不是2008,是2005
去掉
using System.Linq;

    public TextBox_Algorithm()
        {
            InitializeComponent();
        }

编译后,一切正常


我之前都说了,编译是没事,运行就会有问题。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,这时,回到“查看代码”就会出现我上述的错误图片说明。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,按F5运行,也会这样,我说的是运行,不是IDE的编译。

没问题,把这个控件封装到一个类库,然后我在另一个应用程序里用,很正常
[/Quote]

不会吧。。。。。

怎么可能。

我在我这里会弹出如我上述的图片错误问题。

那是因为我对TypeConverter改动过,因为对参数不了解,所以有些条件我都可以改错了。

怎么你的没问题。。。。这不可能,除非你自己改过什么了?

using System.Linq;估计不是这个问题。我这些都没有用到Linq的东西。
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 linjf520 的回复:]
引用 7 楼 ncjcz 的回复:
我用的不是2008,是2005
去掉
using System.Linq;

    public TextBox_Algorithm()
        {
            InitializeComponent();
        }

编译后,一切正常


我之前都说了,编译是没事,运行就会有问题。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,这时,回到“查看代码”就会出现我上述的错误图片说明。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,按F5运行,也会这样,我说的是运行,不是IDE的编译。
[/Quote]
没问题,把这个控件封装到一个类库,然后我在另一个应用程序里用,很正常
Jave.Lin 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ncjcz 的回复:]
我用的不是2008,是2005
去掉
using System.Linq;

    public TextBox_Algorithm()
        {
            InitializeComponent();
        }

编译后,一切正常
[/Quote]

我之前都说了,编译是没事,运行就会有问题。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,这时,回到“查看代码”就会出现我上述的错误图片说明。

或是,在属性窗口设置好PermissionKeys属性的各子属性值之后,按F5运行,也会这样,我说的是运行,不是IDE的编译。
Jave.Lin 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cstod 的回复:]
你没看到转换是从object到object吗?
所以不一定是从字符串转,可以从任一类型转到另一类型
而这个转换是你自己定义的
[/Quote]

我想问的是,他里面那些方法,各各方法,各各参数,怎么用。

我知道是转换。

但参数的使用说明MSDN也没有说。

我就想了解就这个。
Jave.Lin 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ncjcz 的回复:]
我用的不是2008,是2005
去掉
using System.Linq;

    public TextBox_Algorithm()
        {
            InitializeComponent();
        }

编译后,一切正常
[/Quote]

你试试对我那个控件的PermissionKeys属性,回到[设计]里,在属性窗口中设置看看设置好后,运行是否有我一样的问题。
CsToD 2009-09-17
  • 打赏
  • 举报
回复
你没看到转换是从object到object吗?
所以不一定是从字符串转,可以从任一类型转到另一类型
而这个转换是你自己定义的
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
我用的不是2008,是2005
去掉
using System.Linq;

public TextBox_Algorithm()
{
InitializeComponent();
}

编译后,一切正常
Jave.Lin 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cstod 的回复:]
一般重写ConvertTo这一个就行了
你用过html或xaml没有?
他里面所有的属性都是用字符器来给值的
比如:
Height="20"
Color="Red"
这个时候就需要转换器将其转换成正确的类型
[/Quote]

xaml没有用过。
html hyper text mark languag...通常只为网页html而已。

不过听你这么说,意思是:“TypeConverter”就是把字符器转成相应的属性的一个东西。

但怎么用?

我上面的源码怎么忙乱好呢?
CsToD 2009-09-17
  • 打赏
  • 举报
回复
一般重写ConvertTo这一个就行了
你用过html或xaml没有?
他里面所有的属性都是用字符器来给值的
比如:
Height="20"
Color="Red"
这个时候就需要转换器将其转换成正确的类型
Jave.Lin 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cstod 的回复:]
你的问题太抽象了吧?不能具体点吗?
[/Quote]

现在够详细了,到您来发挥了。
Jave.Lin 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ncjcz 的回复:]
http://tech.it168.com/d/2008-06-30/200806300953554.shtml
http://book.csdn.net/bookfiles/533/10053318031.shtml
去看看吧
[/Quote]

我要的是C/S的。。。

我的部份源码:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel.Design.Serialization;
using System.Reflection;

namespace SiteToolsProject
{
public partial class TextBox_Algorithm : TextBox
{
public TextBox_Algorithm()
{
InitializeComponent();
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool result = FilterInputKeys(keyData);
if (result)
return result;
//return true;
//MessageBox.Show(keyData.ToString());
return base.ProcessCmdKey(ref msg, keyData); ;

}

private bool FilterInputKeys(Keys keyData)
{
bool tag = false;
//Code here
if (SetPermissionKeys.Enable)
{
if (SetPermissionKeys.SetThePermission == SetPermisstion.AllowThePermisstionKeys)
{
//AllowThePermisstionKeys
if (SetPermissionKeys.ThePermissionKeys.Contains(keyData))
{
tag = false;
}
else
{
tag = true;
}
return tag;
}
if (SetPermissionKeys.SetThePermission == SetPermisstion.NotAllowThePermissionKeys)
{
//NotAllowThePermisstionKeys
if (SetPermissionKeys.ThePermissionKeys.Contains(keyData))
{
tag = true;
}
else
{
tag = false;
}
return tag;
}
}
return tag;
}

public class MyConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(TextBox_Algorithm.PermissionKeys)) return true;

return base.CanConvertFrom(context, sourceType);
}


public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(TextBox_Algorithm.PermissionKeys)) return true;

if (destinationType == typeof(InstanceDescriptor)) return true;

return base.CanConvertTo(context, destinationType);
}

public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
TextBox_Algorithm.PermissionKeys result = new PermissionKeys();
if (destinationType == typeof(TextBox_Algorithm.PermissionKeys))
{
PermissionKeys permissionKeys = (PermissionKeys)value;
//result = permissionKeys.Min.ToString() + "," + permissionKeys.Max.ToString() + "," + permissionKeys.Sex.ToString();
result = new PermissionKeys();

return result;

}

if (destinationType == typeof(InstanceDescriptor))
{
ConstructorInfo ci = typeof(PermissionKeys).GetConstructor(new Type[] { typeof(List<Keys>), typeof(TextBox_Algorithm.SetPermisstion),typeof(bool) });
PermissionKeys permissionKeys = (PermissionKeys)value;

return new InstanceDescriptor(ci, new object[] { permissionKeys.ThePermissionKeys , permissionKeys.SetThePermission,permissionKeys.Enable });
}
return base.ConvertTo(context, culture, value, destinationType);
}

public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is PermissionKeys)
{
PermissionKeys pk = new PermissionKeys();
return pk;
}
return base.ConvertFrom(context, culture, value);
}

public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}

public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
return TypeDescriptor.GetProperties(typeof(PermissionKeys), attributes);
}
}

private PermissionKeys _setPermissionKeys = new PermissionKeys();

public PermissionKeys SetPermissionKeys
{
get { return _setPermissionKeys; }
set { _setPermissionKeys = value; }
}

[TypeConverter(typeof(MyConverter))]
public class PermissionKeys
{
public PermissionKeys()
{
}

private List<Keys> _thePermissionKeys = new List<Keys>();

public List<Keys> ThePermissionKeys
{
get { return _thePermissionKeys; }
set { _thePermissionKeys = value; }
}

private SetPermisstion _setThePermission;

public SetPermisstion SetThePermission
{
get { return _setThePermission; }
set
{
if (!TypeDescriptor.GetConverter(typeof(SetPermisstion)).IsValid(value))
{
throw new ArgumentException();
}

_setThePermission = value;
}
}

private bool _enable;

public bool Enable
{
get { return _enable; }
set { _enable = value; }
}
}

/// <summary>
/// 设置限制模式
/// </summary>
public enum SetPermisstion
{
/// <summary>
/// 只允许已限制功能键的集合
/// </summary>
AllowThePermisstionKeys = 0,
/// <summary>
/// 禁止已限制功能键的集合
/// </summary>
NotAllowThePermissionKeys = 1
}
}
}



我想对TextBox的控件扩展而已。

就是对用户指定的字符屏蔽输入。

但我根本不知道TypeConverter是啥东西。

最主要是,他里面每一个方法,都有什么用?怎么用?


public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{}


public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{}

public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{}

public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{}

public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{}

public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{}


希望可以对上面这每一个方法问一下怎么用,他们的参数都要详细说明一下。

我这些源码,编译没什么问题。

1.编译后.
2.回到设计里,
3.对这个自己扩展的控件的SetPermisstionKeys属性设计后
4.一运行就会弹出:
5.


图片看不到的话,鼠标右键图片->属性->复制URL->网址:粘贴->确定(回车),即可看到。
ncjcz 2009-09-17
  • 打赏
  • 举报
回复
http://tech.it168.com/d/2008-06-30/200806300953554.shtml
http://book.csdn.net/bookfiles/533/10053318031.shtml
去看看吧
CsToD 2009-09-17
  • 打赏
  • 举报
回复
你的问题太抽象了吧?不能具体点吗?

110,534

社区成员

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

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

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