使用js对Table进行排序的方法.作用时,只需要自定义3个样式,ASC正序排序时,需要显示在新增加span中的图片或样式.DESC,NONE同样.
引入jquery框架.
使用table_Sort("GridView1",new Array(1,2));调用 .
首先,需要对应的3条css
.asc{ color:Red;}
.desc{color:Blue;}
.none{color:Yellow}
需要的JS
代码需要Jquery的支持
function table_Sort(name,col) {
var table = $("#" + name);
var table_th = table.find("> tbody > tr > th");//使用个>符号,可以只查询到指定的路径下.可防止Table中,嵌套Table时出错.
if (!col || col.length == 0) {//如果未指定列进行操作,默认对所有列进行排列
col = new Array();
for (var z in table_th) col.push(z);
}
for (var z in col) {
table_th.eq(col[z]).css("cursor", "pointer");//加上手势
table_th.eq(col[z]).append("<span class='none' type='order'>order</span>");//加上样式
table_th.eq(col[z]).click(function(index) {
var th = $(this);
var rule = th.find("span[type=order]").eq(0).attr('class');//获取应该进行排列的方式
table.find("> tbody > tr > th").find("span[type=order]").attr('class', 'none');//将所有排序设置为默认
if (rule == 'desc') th.find("span[type=order]").eq(0).attr('class', 'asc');
else th.find("span[type=order]").eq(0).attr('class', 'desc');
var index = table.find("tr:first-child").find("th").index(th[0]);
var arr_tr = table.find("> tbody > tr");
var size = arr_tr.size();
for (var i = 1; i < size - 1; i++) {
for (var y = i + 1; y < size; y++) {
arr_tr = table.find("> tbody > tr");
var leftvalue = arr_tr.eq(i).find(" > td").eq(index).html().toLowerCase();
var rightvalue = arr_tr.eq(y).find(" > td").eq(index).html().toLowerCase();
if (rule == 'desc') {
if (leftvalue < rightvalue) {
arr_tr.eq(i).before(arr_tr.eq(y));
}
}
else {
if (leftvalue > rightvalue) {
arr_tr.eq(i).before(arr_tr.eq(y));
}
}
}
}
});
}
}
调用,第2个参数可以不写,不写,默认对所有列进行排序
table_Sort("GridView1",new Array(1,2));
在某些需求下,需要将一个类进行序列化,存入数据库,等另一个操作从数据库中取出,再反序列化成类.
一般实现:
#region 把一个对象序列化成流
/// <summary>
/// 把一个对象序列化成流
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
internal byte[] SerializeObject(object obj)
{
MemoryStream m = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(m, obj);
//再把MemoryStream 流转成byte[]形式!
byte[] buffer = m.GetBuffer();
m.Close();
m.Dispose();
return buffer;
}
#endregion
#region 把一个流转成对象
/// <summary>
/// 把一个流转成对象
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
internal object UnSerializeObject(byte[] buffer)
{
MemoryStream m = new MemoryStream(buffer);
BinaryFormatter deserializer = new BinaryFormatter();
object obj = (deserializer.Deserialize(m));//反序列化得到的对象
m.Close();
m.Dispose();
return obj;
}
#endregion
}
当需求发生变化,序列化与反序列不在一个project(需要序列化的类写在project中,而非共同的ClassLibrary)中进行时,用以上方法反序列化就会出错,会提示找不到类.
类的信息:
[NameSpace.ClassName,assemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
此时就需要重写SerializationBinder,修改类的命空间
代码:
internal static object UnSerializeObject(byte[] buffer)
{
MemoryStream m = new MemoryStream(buffer);
BinaryFormatter deserializer = new BinaryFormatter();
deserializer.Binder = new OverrideSerializationBinder();
object obj = deserializer.Deserialize(m);//反序列化得到的对象
m.Close();
m.Dispose();
return obj;
}
/// <summary>
/// 重写SerializationBinder ,让序列化的对象从当前数据程序集中取出.
/// </summary>
sealed class OverrideSerializationBinder : System.Runtime.Serialization.SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
return Type.GetType( typeName);
}
}
重写SerializationBinder后,看似不错了.但有时候,也会碰上到麻烦,比如,你需要序列化的类中有泛型的存在,或者assemblyName不相同,NameSpace也不相同.
例
[Serializable]
public class class1
{
List<class2> Class2List;
}
[Serializable]
public class class2
{
}
此时在BindToType中截取到的typeName就是为以下信息,又回到了上一错误.
例:
System.Collections.Generic.List`1[[NameSpace.ClassName, assemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
解决方法:
internal static object UnSerializeObject(byte[] buffer, Type type)
{
MemoryStream m = new MemoryStream(buffer);
BinaryFormatter deserializer = new BinaryFormatter();
deserializer.Binder = new OverrideSerializationBinder() { NewNameSpace = type.FullName.Substring(0, type.FullName.LastIndexOf(".")) };
object obj = deserializer.Deserialize(m);//反序列化得到的对象
m.Close();
m.Dispose();
return obj;
}
/// <summary>
/// 重写SerializationBinder ,让序列化的对象从当前数据程序集中取出.
/// </summary>
sealed class OverrideSerializationBinder : System.Runtime.Serialization.SerializationBinder
{
public string OldNameSpace = string.Empty;
public string NewNameSpace;
public override Type BindToType(string assemblyName, string typeName)
{
//Type t = Type.GetType("System.Collections.Generic.List`1[["+NewNameSpace+".MarketMediaCondition]]");
//得到旧的命名空间名称
if (OldNameSpace == string.Empty)
OldNameSpace = typeName.Substring(0, typeName.LastIndexOf("."));
//针对处理有泛型的
if (typeName.IndexOf("System.Collections.Generic") == 0)
{
typeName = typeName.Split(',')[0];
typeName += "]]";
}
string newName = typeName.Replace(OldNameSpace, NewNameSpace);
return Type.GetType(newName);
}
}
或许还有更好的解决方法.
希望大家能讨论一下.