この質問の背景として、「作成されたコード」をにバインドしたいと思いDataTable
ますaspx:GridView
。このテーブルを永続化するために、ISerializable
インターフェイスを実装します。テーブルは正しく表示されますが、行を並べ替えるためのポストバックでInvalidCastExcpetion
は、row.ItemArrayの要素がtypeからtypeに変更されたため、aがスローされdouble
ますstring
。
これがクラスです。注:2つのコンストラクター。1つはDataTableを最初に構築するためのもので、もう1つは逆シリアル化プロセスでテーブルを構築するためのものです。
[global::System.Serializable()]
[global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
public partial class HeatMapVisualisationDataTable : DataTable, System.Runtime.Serialization.ISerializable
{
#region members
public double _valueMin { get; private set; }
public double _valueMax { get; private set; }
#endregion membders
public HeatMapVisualisationDataTable(XemlExperimentHeatMapDataTable data)
: base("result", "http://gmd.mpimp-golm.mpg.de/HeatMap")
{
this.Columns.Add(new DataColumn("metabolite", typeof(Guid)));
this.Columns.Add(new DataColumn("name", typeof(string)));
DataColumn[] PrimaryKeyColumns = new DataColumn[1];
PrimaryKeyColumns[0] = this.Columns["metabolite"];
this.PrimaryKey = PrimaryKeyColumns;
SortedDictionary<int, DataColumn> headers = new SortedDictionary<int, DataColumn>();
foreach (var item in data.AsParallel().AsEnumerable().Select(x => x.ObservationPointId).Distinct().OrderBy(x => x))
{
DataColumn dc = this.Columns.Add(item.ToString(), typeof(Double));
headers.Add(item, dc);
}
foreach (var item in data)
{
DataRow tmpRow = base.Rows.Find(item.MetaboliteId);
if (tmpRow == null)
{
tmpRow = base.Rows.Add(new object[] { item.MetaboliteId });
tmpRow["name"] = item.MetaboliteName;
}
tmpRow[headers[item.ObservationPointId]] = item.value;
}
this.AcceptChanges();
_valueMax = data.AsParallel().AsUnordered().Max(x => x.value);
_valueMin = data.AsParallel().AsUnordered().Min(x => x.value);
}
public HeatMapVisualisationDataTable(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext ctxt) :
base(info, ctxt)
{
_valueMin = (double)info.GetValue("valueMin", typeof(double));
_valueMax = (double)info.GetValue("valueMax", typeof(double));
}
public override void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext ctxt)
{
base.GetObjectData(info, ctxt);
info.AddValue("valueMin", _valueMin);
info.AddValue("valueMax", _valueMax);
}
}
SerializationInfo
コンストラクターのでスキーマを読み取ることで確認できるようにHeatMapVisualisationDataTable(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext ctxt)
、テーブルは正しくシリアル化されており、シリアル化されたxmlスキーマに関して「ストア」から正しく送信されています。ただし、このコンストラクターで構築された基本クラスを見ると、シリアル化前の型のすべての列が型になっていdouble
ますstring
。私は何が間違っているのですか?
更新1double
:数値データ型をからfloat
またはに変更することでこの問題を再現することもできますdecimal
。タイプの主キー列はGuid
、正しいタイプに逆シリアル化されます。
更新2:私の意見では、説明されている動作は、DataTable.ReadXml()
列のデータ型が文字列に置き換えられるいくつかの問題のフォローアップです。
ありがとう、1月