目录
C#正则表达式
C#语言之字符串和正则表达式
C# 正则表达式判断IP地址是否合法
C#:string字符串处理
c#字符串按行读取
C#数值转固定长度字符串
C#字符串转换为数字(不考虑异常)——推荐不考虑异常的字符串转数字
C#字符串判断是否相等(忽略大小写)——推荐使用
c#怎样取到某个特定字符后面的字符,比如XXXXX#123 和 XXX#12中#后面的数字
C# 截取字符串最后一个字符
C# 提取字符串中所有数字的分组
C#: byte字节处理
C#: byte.ToString("x2")字节转16进制字符串
C#运算符
C# 运算符 ??、?: 的用法和说明
winform控件处理
C# 将ComboBox设置为禁止编辑的方法
C# SplitContainer的panel1的宽度不变
C# winfrom 菜单中快捷键的设置
C#遍历窗体所有控件或某类型所有控件
Timer控件定时操作
ListView操作:新增列行、设置属性颜色、清除内容
C#TextBox设置默认值(获取焦点后默认值消失)
c#TextBox输入框自动提示、补全功能(仅限单行文本框)
C#委托
通过Action或Func的形式实现函数当做参数传递的效果
C# WINFORM窗体间通过委托和事件传值(自定义事件参数)--实例详解
C#一段非常经典的属性值改变引发自定义事件的例子
C#类型转换
c#as和强制转换
C#DataGridView
C# DataGridView 禁止列排序
C#DataGridView默认的第一列
C#中DataGridView动态添加行及添加列的方法
C# 调试方法
C# debug调试信息打印及输出
C#多线程
C#获得当前线程的ID
C#创建线程Thread
C#反射
C#通过“程序集.命名空间.类名”获取实例
C#Linq
Linq查询操作符
C#XML
C#按名称读取节点和属性
问题来自实际项目中遇到的问题,解决方法来自网络收集,最后更新时间2020.1.8
System.Text.RegularExpressions.Regex rx = new System.Text.RegularExpressions.Regex(@"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))");
if (rx.IsMatch(str_ip) == false)
{
MessageBox.Show("IP地址不合法!");
}
string Content;
string[] ContentLines = Content.Split(new string[] { "\r\n" }, StringSplitOptions.None);//不忽略空行
string[] ContentLines = Content.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); //忽略空行
//固定长度字符串处理
//int类型转固定长度
Console.WriteLine(string.Format("{0:D5}", 111));
//长度超出则显示原值
Console.WriteLine(string.Format("{0:D5}", 222222222));
//字符串转固定长度
//使用PadLeft方法可以自定义填充值
string str = "333";
Console.WriteLine(str.PadLeft(10));
Console.WriteLine(str.PadLeft(10, '0'));
Console.WriteLine(str.PadRight(10));
Console.WriteLine(str.PadRight(10, '0'));
结果:
str为null或其他不规则字符串时转换失败,直接返回为d=0,不用考虑异常;
double d;
string str="18";
double.TryParse(str, out d)
//使用TryParse转换时没有异常,转换失败返回0
string str="point"
if(string.Compare(str, "POINT", true) == 0)
//public static int Compare(string strA, string strB, bool ignoreCase);
// 摘要:
// 比较两个指定的 System.String 对象(其中忽略或考虑其大小写),并返回一个整数,指示二者在排序顺序中的相对位置。
//
// 参数:
// strA:
// 要比较的第一个字符串。
//
// strB:
// 要比较的第二个字符串。
//
// ignoreCase:
// 要在比较过程中忽略大小写,则为 true;否则为 false。
//
// 返回结果:
// 一个 32 位带符号整数,指示两个比较数之间的词法关系。值条件小于零strA 小于 strB。零strA 等于 strB。大于零strA 大于 strB。
string a = "XXXXX#eee";
string arr = a.Split('#')[1];
Console.Write(arr);
k = k.Substring(k.Length-1, 1);
[C#].NET/C#应用程序编程开发中从字符串中查找并提取数字的方法有哪些呢?
string input = "There are 4 numbers in this string: 40, 30, and 10.";
string[] numbers = Regex.Split(input, @"\D+");
foreach (string value in numbers)
{
if (!string.IsNullOrEmpty(value))
{
int i = int.Parse(value);
Console.WriteLine("Number: {0}", i);
}
}
结果为:Number: 4 Number: 40 Number: 30 Number: 10
三元(运算符)表达式——?:
例如:x?y:z 表示如果表达式x为true,则返回y;如果x为false,则返回z,是省略if{}else{}的简单形式。
空合并运算符——??
如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。
例如:a??b 当a为null时则返回b,a不为null时则返回a本身。
空合并运算符为右结合运算符,即操作时从右向左进行组合的。如,“a??b??c”的形式按“a??(b??c)”计算。
将ComboBox的DropDownStyle 属性设置为 DropDownList即可:
ISsplitterFixed属性设为true(禁止拆分器的移动),FixedPanel属性设为panel1(不随窗体大小改变panel1的宽度)。
一个菜单中有 文件(F) 查看(V) 收藏(A),不用鼠标去点,直接按Alt+F打开文件,按Alt+V打开查看,按Alt+A打开收藏。
在各个菜单控件的Text上写上(&字母)即可:
文件(F) :文件(&F)
查看(V) :查看(&V)
收藏(A) :收藏(&A)
遍历所有TextBox类型控件或者所有DateTimePicker控件(使用as进行类型转换、效率更高)
foreach (Control control in this.Controls)
{
//遍历所有TextBox...
if (control is TextBox)
{
TextBox t = (TextBox)control;
t.Enabled = false;
}
//遍历所有DateTimePicker...
if (control is DateTimePicker)
{
DateTimePicker d = (DateTimePicker)control;
d.Enabled = false;
}
}
可以通过Click事件中传递过来的sender对象获取按钮名称(Button)sender.Name,方法也适用于其它控件的其它事件
private void button1_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
MessageBox.Show(button.Name);
}
#region Timer控件定时操作
private void button3_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Interval = 1000;//1秒1次
timer1.Tick += new EventHandler(tmr_Tick);
timer1.Start();
}
private void tmr_Tick(object sender, EventArgs e)
{
//到达设定时间后的事件
label1.Text = DateTime.Now.ToString() + "执行了";
}
private void button4_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}
#endregion
//ListView新增列
listView1.Columns.Add("年龄", 100, HorizontalAlignment.Center);
listView1.Columns.Add("班级", 80, HorizontalAlignment.Center);
listView1.Columns.Add("性别", 40, HorizontalAlignment.Center);
listView1.Columns.Add("职业", 100, HorizontalAlignment.Center);
button5.Enabled = false;
//ListView新增行 批量更新防闪烁
listView1.BeginUpdate();
listView1.Items.Add("row1", "张三", 0);
listView1.Items["row1"].SubItems.Add("21");
listView1.Items["row1"].SubItems.Add("98001");
listView1.Items["row1"].SubItems.Add("男");
listView1.Items["row1"].SubItems.Add("学生");
listView1.Items.Add("row2", "李四", 0);
listView1.Items["row2"].SubItems.Add("22");
listView1.Items["row2"].SubItems.Add("98002");
listView1.Items["row2"].SubItems.Add("女");
listView1.Items["row2"].SubItems.Add("教师");
listView1.Items.Add("row3", "王五", 0);
listView1.Items["row3"].SubItems.Add("23");
listView1.Items["row3"].SubItems.Add("98003");
listView1.Items["row3"].SubItems.Add("男");
listView1.Items["row3"].SubItems.Add("工程师");
listView1.Items.Add("row4", "赵六", 0);
listView1.Items["row4"].SubItems.Add("24");
listView1.Items["row4"].SubItems.Add("98004");
listView1.Items["row4"].SubItems.Add("女");
listView1.Items["row4"].SubItems.Add("公务员");
listView1.EndUpdate();
//设置ListView属性
listView1.GridLines = true;
listView1.View = View.Details;
listView1.LabelEdit = false;
listView1.HeaderStyle = ColumnHeaderStyle.Clickable;
//更改行颜色
for (int i = 0; i < listView1.Items.Count; i++)
{
if (i % 2==0)
{
listView1.Items[i].BackColor = Color.Gray;
}
}
listView1.Items.Clear(); //清除列表内容 不包含表头
listView1.Clear(); //清除列表包含表头
结果:
原文:Winform给TextBox设置默认值(获取焦点后默认值消失)
主要是通过TextBox的获取焦点Enter和失去焦点Leave两个事件来实现的,
思路如下:
1.设置一个字符串常量,作为TextBox的默认值;
2.在界面的构造方法中将默认值赋值给TextBox,并设置TextBox的ForeColor为灰色;
3.编写获取焦点事件 TextBox_Enter(object sender, EventArgs e) ,判断TextBox的Text是否等于默认值,
是:则将TextBox内容清空,并将前景色ForeColor改成正常的颜色
4.失去焦点事件 TextBox_Leave(object sender, EventArgs e),判断TextBox的Text是否为空,如果为空,则再次以灰色来显示默认值
具体的代码如下:
//TextBox的默认值
private const String DEFAULT_TEXT = "Please enter your words.";
//构造方法
public Form1()
{
//...其他代码
//为TextBox设置默认值和默认值的前景色(字体颜色)
SetDefaultText();
}
private void SetDefaultText()
{
textBox1.Text = DEFAULT_TEXT;
textBox1.ForeColor = Color.Gray;
}
//获取焦点事件 Enter
private void textBox1_Enter(object sender, EventArgs e)
{
if (textBox1.Text == DEFAULT_TEXT)
{
textBox1.Text = "";
textBox1.ForeColor = Color.Black;
}
}
//失去焦点事件 Leave
private void textBox1_Leave(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(textBox1.Text))
SetDefaultText();
}
结果:
private void Form1_Load(object sender, EventArgs e)
{
//仅限单行文本框使用
var txtSource = new AutoCompleteStringCollection();
txtSource.AddRange(new string[]
{
"January",
"February",
"March",
"April",
"May",
"June"
});
//使用 AutoCompleteSource 属性使 TextBox 控件能够接受其自动完成行为的自定义源
textBox1.AutoCompleteCustomSource = txtSource;
//使用 AutoCompleteMode 属性设置自动完成候选人的显示方式
textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
//使用 AutoCompleteCustomSource 属性设置值的自定义列表
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
}
参考文章:https://www.crifan.com/csharp_pass_function_as_parameter_using_action_or_func/
//职能的宣布和执行
public void updateProgress(int percentage)
{
pgbDownload.Value = percentage;
}
//调用其他函数,将函数作为参数传递
getUrlRespStreamBytes(xxx, updateProgress);
//其他相关功能
public int getUrlRespStreamBytes(xxx, Action funcUpdateProgress)
{
//...
if (funcUpdateProgress != null)
{
int currentPercent = 20;
funcUpdateProgress(currentPercent);
}
//...
}
【总结】
代码比较简单,其中的原理可以参考一下。
想看实际运行效果的请访问原文:https://codedefault.com/p/csharp-winform-pass-value-between-forms-by-delegate-and-event
赋值窗体代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DelegatePassValue
{
public partial class frmAddress : Form
{
//声明一个更新Address的委托
public delegate void AddressUpdateHandler(object sender, AddressUpdateEventArgs e);
//声明一个更新Address的事件
public event AddressUpdateHandler AddressUpdated;
public frmAddress()
{
InitializeComponent();
}
private void btnOk_Click(object sender, EventArgs e)
{
var args = new AddressUpdateEventArgs(txtCountry.Text, txtState.Text, txtCity.Text, txtZipCode.Text);
AddressUpdated(this,args);
this.Dispose();
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.Dispose();
}
}
public class AddressUpdateEventArgs : System.EventArgs
{
private string mCountry;
private string mState;
private string mCity;
private string mZipCode;
public AddressUpdateEventArgs(string sCountry, string sState, string sCity, string sZipCode)
{
this.mCountry = sCountry;
this.mState = sState;
this.mCity = sCity;
this.mZipCode = sZipCode;
}
public string Country { get { return mCountry; } }
public string State { get { return mState; } }
public string City { get { return mCity; } }
public string ZipCode { get { return mZipCode; } }
}
}
主窗体代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DelegatePassValue
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private void btnSetAddress_Click(object sender, EventArgs e)
{
var frmAddr = new frmAddress();
frmAddr.AddressUpdated += new frmAddress.AddressUpdateHandler(AddressForm_ButtonClicked);
frmAddr.Show();
}
private void AddressForm_ButtonClicked(object sender, AddressUpdateEventArgs e)
{
txtCountry.Text = e.Country;
txtState.Text = e.State;
txtCity.Text = e.City;
txtZipCode.Text = e.ZipCode;
}
private void btnClose_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
public class MyClass
{
public event EventHandler MyPropertyChanging;
public event EventHandler MyPropertyChanged;
private int _myProperty;
public int MyProperty
{
get { return _myProperty; }
set
{
if (value != _myProperty)
{
PropertyChagedEventArgs e = new PropertyChagedEventArgs("MyProperty", _myProperty, value);//初始化
if (this.MyPropertyChanging != null)
{
this.MyPropertyChanging(this, e);
if (e.Cancel) return;
}
_myProperty = (int)e.NewValue;
if (this.MyPropertyChanged != null)
{
this.MyPropertyChanged(this, e);
}
}
}
}
}
///
/// 通用的类
///
public class PropertyChagedEventArgs : EventArgs
{
public PropertyChagedEventArgs(string propertyName,object oldValue,object newValue)
{
PropertyName = propertyName;
OldValue = oldValue;
NewValue = newValue;
}
public bool Cancel { get; set; }
public string PropertyName { get; private set; }
public object OldValue { get; private set; }
public object NewValue { get; set; }
}
内容来自:https://www.cnblogs.com/rush/archive/2011/05/13/as_is.html
C#是一门强类型语言,一般情况下,我们最好避免将一个类型强制转换为其他类型,但有些时候难免要进行类型转换。
先想想究竟哪些操作可以进行类型转换(先不考虑.NET提供的Parse),一般我们都有以下选择:
使用as操作符转换,
使用传统C风格的强制转型
使用is来做一个转换测试,然后再使用as操作符或者强制转
正确的选择应该是尽可能地使用as操作符,因为它比强制转型要安全,而且在运行时层面也有比较好的效率(注意的是as和is操作符都不执行任何用户自定义的转换,只有当运行时类型与目标转换类型匹配时,它们才会转换成功)。
as只能用于引用类型不能用于值类型。
as和强制转换之间最大的区别就在于如何处理用户自定义的转换。操作符 as和 is 都只检查被转换对象的运行时类型,并不执行其他的操作。如果被转换对象的运行时类型既不是所转换的目标类型,也不是其派生类型,那么转型将告失败。但是强制转型则会使用转换操作符来执行转型操作,这包括任何内建的数值转换(如:long转int)。
一般情况我们应该先考虑使用as进行类型转换,然后再考虑使用is,最后才考虑使用强制转换。
SortMode是DataColumn的属性值,通过DataGridView获取DataColumn,然后将DataColumn的SortMode属性设置也可以达到同样的目的。
DataGridView中的Columns属性里面可以设置。进入“Edit Columns”窗口后,在相应的列属性设置里面把SortMode属性选择为"NotSortable"就可以了。
for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
{
this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
}
创建DGV会默认添加第一列,默认的第一列为RowHeaders,也就是行标题列,可设置DGV的RowHeadersVisible属性控制其显示与否。
Datagridview添加列:
DataGridViewTextBoxColumn acCode = new DataGridViewTextBoxColumn();
acCode.Name = "acCode";
acCode.DataPropertyName = "acCode";
acCode.HeaderText = "A/C Code";
dgvVouchers.Columns.Add(acCode);
Datagridview创建行:
DataGridViewRow dr = new DataGridViewRow();
dr.CreateCells(dgvVouchers);
//填充行数据
string[]strs=new string[dgvVouchers.Columns.Count];
//...写数组的值...
dr.SetValues(strs);
//添加的行作为第一行
dgvVouchers.Rows.Insert(0, dr);
//添加的行作为最后一行
dgvVouchers.Rows.Add(dr);
debug提供了许多调试指令,只在[debug模式下才执行](运行按钮后面的下拉框可选)
//断言:将出现一个对话框
System.Diagnostics.Debug.Assert(false,"信息");
//下例将信息存入磁盘文件
System.Diagnostics.TextWriterTraceListener t=new System.Diagnostics.TextWriterTraceListener(@"c:/a.txt");
System.Diagnostics.Debug.Listeners.Add(t);
System.Diagnostics.Debug.WriteLine("信息");
t.Flush();
//将信息输出到窗口不保存
System.Diagnostics.Debug.WriteLine("信息");
官方线程介绍:https://docs.microsoft.com/zh-cn/dotnet/standard/threading/?view=netframework-4.8
网络上常见的AppDomain.GetCurrentThreadId().ToString()方法已经过时,禁止使用。
常用方法:
//推荐
Thread.CurrentThread.ManagedThreadId.ToString()
“反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。
假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型):
Assembly assembly = Assembly.LoadFile(“程序集路径,不能是相对路径”); // 加载程序集(EXE 或 DLL)
object obj = assembly.CreateInstance(“类的完全限定名(即包括命名空间)”); // 创建类的实例
若要反射当前项目中的类(即当前项目已经引用它了)可以为:
// 获取当前程序集
Assembly assembly = Assembly.GetExecutingAssembly();
// 创建类的实例,返回为 object 类型,需要强制类型转换
object obj = assembly.CreateInstance(“类的完全限定名(即包括命名空间)”);
//也可以为:
Type type = Type.GetType(“类的完全限定名”);
object obj = type.Assembly.CreateInstance(type);
通用反射帮助类,通过“程序集.命名空间.类名”返回指定类型对象:
/*参考:http://www.cnblogs.com/encoding/archive/2010/09/10/1823399.html
* http://www.cnblogs.com/encoding/archive/2010/09/10/1823444.html
* */
///
/// 反射帮助类
///
public static class ReflectionHelper
{
///
/// 创建对象实例
///
///
/// 命名空间.类型名
/// 程序集
///
public static T CreateInstance(string fullName, string assemblyName)
{
string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
Type o = Type.GetType(path);//加载类型
object obj = Activator.CreateInstance(o, true);//根据类型创建实例
return (T)obj;//类型转换并返回
}
///
/// 创建对象实例
///
/// 要创建对象的类型
/// 类型所在程序集名称
/// 类型所在命名空间
/// 类型名
///
public static T CreateInstance(string assemblyName, string nameSpace, string className)
{
try
{
string fullName = nameSpace + "." + className;//命名空间.类型名
//此为第一种写法
object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
return (T)ect;//类型转换并返回
//下面是第二种写法
//string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
//Type o = Type.GetType(path);//加载类型
//object obj = Activator.CreateInstance(o, true);//根据类型创建实例
//return (T)obj;//类型转换并返回
}
catch
{
//发生异常,返回类型的默认值
return default(T);
}
}
}
参考:https://www.jianshu.com/p/a10bf285dcf7
//Linq查询操作符
string[] words = { "zero","one", "two", "three", "four" };
int[] numbers = { 0, 1, 2, 3, 4 };
//1.聚合
numbers.Sum();
numbers.Average();
numbers.Count();
numbers.LongCount(x => x % 2 == 0);
words.Min();
words.Max();
numbers.Aggregate((a, b) => (a + b));
//2.链接
numbers.Concat(new[] { 2, 3, 4, 5, 6 });
//3.转换
words.Cast() //遍历时遇到转换失败的地方,会抛出异常
words.OfType()
numbers.ToArray();
numbers.ToList();
words.ToDictionary(w => w.Substring(0, 2));
numbers.Concat(new[] { 2, 3, 4, 5, 6 });
//4.元素操作符
words.ElementAt(2);
words.ElementAtOrDefault(10);
words.First();
words.First(w => w.Length == 3);
words.First(w => w.Length == 10); //异常:没有匹配的元素
words.FirstOrDefault (w => w.Length == 10); //null
words.Last(); //"four“
words.Single(); //异常:不止一个元素
words.SingleOrDefault(); //异常:不止一个元素
words.Single(word => word.Length == 5); //“three“ 返回唯一元素
words.Single(word => word.Length == 10); //异常:没有匹配的元素
words.SingleOrDefault(w => w.Length == 10); //null 返回唯一元素
//5.相等操作
words.SequenceEqual(new[]{“ZERO”,“ONE”,“TWO”,“THREE”,“FOUR”},StringComparer.OrdinalIgnoreCase);
//6.生成
numbers.DefaultIfEmpty(); //0, 1, 2, 3, 4
Enumerable.Range(0, 100);
Enumerable.Repeat(25, 2);//生成包含重复值的序列
Enumerable.Empty();//生成任意类型的空序列
//7.分组
words.GroupBy(word => word.Length);
//8.连接
words.Join(allStrings, name => name[0], color => allStrings[0],(name, color) => name + " - " + color);
words.GroupJoin
//9.分部
words.Take(2); //"zero", "one"
words.Skip(2); //"two","three", "four"
words.TakeWhile(word => word.Length <= 4); //"zero", "one", "two"
words.SkipWhile(word => word.Length <= 4); //"three","four“
//10.投影
words.Select(word => word.Length);// 4, 3, 3, 5, 4
words.Select((word, index) => index.ToString() + ": " + word); //"0: zero", "1: one", "2: two","3: three", "4: four"
words.SelectMany(word => word.ToCharArray());//'z', 'e', 'r', 'o', 'o', 'n', 'e', 't', 'w', 'o', 't','h', 'r', 'e', 'e', 'f', 'o', 'u', 'r'
//11.数量
words.All(word => word.Length > 3); //false("one"和"two"的确包含3个字母)
words.All(word => word.Length > 2); //true
words.Any(); //true(序列不为空)
words.Any(word => word.Length == 6); //false(没有6个字母的单词)
words.Any(word => word.Length == 5); //true("three"满足这个条件)
words.Contains("FOUR"); //false
words.Contains("FOUR",StringComparer.OrdinalIgnoreCase); //true
//12.过滤
words.Where(word => word.Length > 3); //"zero", "three", "four“
//13.基于集的操作符
"abbc".Distinct(); //"a", "b", "c"
"abbc".Intersect("cd"); //"c"
"abbc".Union("cd");//"a", "b", "c", "d"
"abbc".Except("cd"); //"a", "b"
"cd".Except("abc"); //"d“
//14.排序
words.OrderBy(word => word);
words.Reverse();
words.OrderByDescending(word => word.Length);
string filePath = System.Environment.CurrentDirectory + "/xmlName.xml";
if (File.Exists(filePath))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
//选择匹配 XPath 表达式的第一个 XmlNode
XmlNodeList node = xmlDoc.SelectSingleNode("root").ChildNodes;
//遍历节点
foreach (XmlNode ele in node)
{
if (ele.NodeType != XmlNodeType.Element) continue;
if (ele.Name == "eleName")
{
//读取eleName节点下name属性的值
string name= (ele.Attributes.GetNamedItem("name") as XmlAttribute).Value;
}
}