РЕДАКТИРОВАТЬ: Итак, я решил, что это самый простой способ добраться до желаемый результат — заставить пользователя выбрать тип данных, который он хочет записать. А затем позже проверьте этот тип данных в каждом столбце, а затем поместите кнопку, если этот тип данных существует в столбце.
У меня есть класс «TableFactory», который создает таблицу, которая будет сериализуется и сохраняется в XML. В этот класс я добавил перечисление ColumnDataTypes и раздел для обработки типов, которые я хочу разрешить, сейчас только 3: Integer, String и File(byte[]). Проблема с этим новым подходом заключается в том, что для правильного хранения массива байтов мне нужно преобразовать его в Base64String. Однако при этом тип данных меняется на строку, а не на байт, поэтому кнопки нет.
Класс фабрики таблиц:
Код: Выделить всё
using System.Data;
using System.Xml;
using System.IO;
using System.Xml.Serialization;
using XML_Database.usrctrls;
namespace XML_Database.data
{
public class TableFactory
{
//string _tableName;
DataTable _dt;
//public string TableName { get { return _tableName; } set { _tableName = value; } }
public TableFactory(string tableName)
{
if (this._dt == null)
{
this._dt = new DataTable(tableName);
}
}
public DataTable Table
{
get { return this._dt; }
set { this._dt = value; }
}
public void NewColumn(string ColumnName, ColumnTypes colType)
{
if (!this._dt.Columns.Contains(ColumnName))
{
switch (colType)
{
case ColumnTypes.String:
this._dt.Columns.Add(ColumnName, typeof(String));
break;
case ColumnTypes.Integer:
this._dt.Columns.Add(ColumnName, typeof(Int32));
break;
case ColumnTypes.Binary:
this._dt.Columns.Add(ColumnName, typeof(Byte[]));
break;
}
}
}
public void DeleteColumn(string ColumnName)
{
if (_dt.Columns.Contains(ColumnName))
{
_dt.Columns.Remove(ColumnName);
}
}
public void SaveTable(string Path)
{
data.encryptFiles._SALT = data.dboptions.Salt();
data.encryptStrings._SALT = data.dboptions.Salt();
string tablePath = Path + "\\" + _dt.TableName + ".xml";
DataSet ds = new DataSet();
XmlDocument xDoc = new XmlDocument();
ds.Tables.Clear();
ds.Tables.Add(_dt.Copy());
XmlElement xE = (XmlElement)Serialize(ds);
string strXml = xE.OuterXml.ToString();
xDoc.LoadXml(strXml);
xDoc.Save(tablePath);
if (data.dboptions.DBEncryptionOptions())
{
File.Delete(Path + "\\" + _dt.TableName + "_enc.xml");
data.encryptFiles.EncryptFile(tablePath, tablePath.Replace(".xml", "_enc.xml"), data.encryptStrings.Decrypt(data.dboptions.Pwd(), data.dboptions.Salt()));
}
}
public void LoadTable(string Path)
{
string tablePath = Path + "\\" + _dt.TableName + ".xml";
XmlDocument xDoc = new XmlDocument();
if (File.Exists(tablePath))
{
if (_dt.TableName.Contains("_enc"))
{
MemoryStream ms = new MemoryStream();
data.encryptFiles._SALT = data.dboptions.Salt();
data.encryptStrings._SALT = data.dboptions.Salt();
data.encryptFiles.DecryptToMemory(tablePath, out ms, data.encryptStrings.Decrypt(data.dboptions.Pwd(), data.dboptions.Salt()));
using (ms)
{
xDoc.Load(ms);
}
DataSet ds = (DataSet)Deserialize(xDoc.DocumentElement, typeof(DataSet));
_dt = ds.Tables[0];
}
else
{
xDoc.Load(tablePath);
DataSet ds = (DataSet)Deserialize(xDoc.DocumentElement, typeof(DataSet));
_dt = ds.Tables[0];
}
}
}
private object Deserialize(XmlElement xmlElement, System.Type type)
{
Object transformedObject = null;
try
{
Stream memStream = StringToStream(xmlElement.OuterXml);
XmlSerializer serializer = new XmlSerializer(type);
transformedObject = serializer.Deserialize(memStream);
}
catch (Exception)
{
}
return transformedObject;
}
private Stream StringToStream(string p)
{
MemoryStream memStream = null;
try
{
byte[] buffer = Encoding.UTF8.GetBytes(p);
memStream = new MemoryStream(buffer);
}
catch (Exception)
{
}
finally
{
memStream.Position = 0;
}
return memStream;
}
private XmlElement Serialize(object TransformObject)
{
XmlElement serializedElement = null;
try
{
MemoryStream memStream = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(TransformObject.GetType());
serializer.Serialize(memStream, TransformObject);
memStream.Position = 0;
XmlDocument xDoc = new XmlDocument();
xDoc.Load(memStream);
serializedElement = xDoc.DocumentElement;
}
catch (Exception)
{
}
return serializedElement;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/143 ... tagridview
Мобильная версия