C# datagridview中二进制内容的显示按钮
我有一个充当数据表的xml文件。它保存各种类型的数据。任何列中的数据类型都可能不同。例如:行(1)String,int,date;第(2)行二进制,整数,日期;第(3)行字符串,二进制,int 这就引出了我试图解决的问题,我如何解析单元格内容,并在数据类型为二进制或字节类型的单元格中放置一个按钮 这很棘手,因为不仅不同类型的所有单元格内容都是自动分配给columntypes的,而且必须手动分配 关于如何实现这一点有什么想法吗 另外,我认为使用CellValidating事件我可能能够获得我想要的行为,但是我不知道如何验证字符串实际上是二进制数据 编辑:好的,所以我决定获得所需结果的最简单方法是让用户选择他们希望记录的数据类型。然后在每列中检查该数据类型,如果某列中存在该数据类型,则放置一个按钮 我有一个“TableFactory”类,它生成将被序列化并存储在xml中的表。在这个类中,我添加了一个“ColumnDataTypes”枚举和一个部分来处理我想要允许的类型,现在只有3个,整数、字符串和文件(字节[])。这种新方法的问题在于,为了正确存储字节数组,我必须将其转换为Base64String。但是,这会将数据类型更改为字符串而不是字节,这又将我放回了开头…如何解析列数据并从逻辑上确定它是字节数组而不仅仅是字符串。一旦我知道它是字节数组,我就可以在包含字节数组的单元格中放置一个按钮。有人对如何实现这一点有什么想法吗 表工厂等级:C# datagridview中二进制内容的显示按钮,c#,xml,datagridview,binary-data,C#,Xml,Datagridview,Binary Data,我有一个充当数据表的xml文件。它保存各种类型的数据。任何列中的数据类型都可能不同。例如:行(1)String,int,date;第(2)行二进制,整数,日期;第(3)行字符串,二进制,int 这就引出了我试图解决的问题,我如何解析单元格内容,并在数据类型为二进制或字节类型的单元格中放置一个按钮 这很棘手,因为不仅不同类型的所有单元格内容都是自动分配给columntypes的,而且必须手动分配 关于如何实现这一点有什么想法吗 另外,我认为使用CellValidating事件我可能能够获得我想要的
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;
}
}
}
非常感谢您的帮助!:)
编辑:我可以添加图像,但不能添加常规文件。理想情况下,添加文件和图像是理想的功能。但到目前为止,只有图像会进入我的字节数组列。如果我将列数据类型更改为string并存储转换后的Base64String,我可以存储文件,但我仍然不知道如何解析数据以确认它是一个文件而不仅仅是文本
编辑:好的,我离解决这个问题更近了,但不知道如何克服困难…我可以得到一个按钮来显示,但不在正确的单元格中。这里有更多的代码来帮助任何人帮助我回答这个问题
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
button1.ForeColor = Color.Red;
try
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
foreach (DataGridViewCell cell in dataGridView1.Rows[i].Cells)
{
if (cell.Value != null)
{
if (TryParseBinary(cell.Value.ToString()))
{
var buttonCell = new DataGridViewButtonCell();
buttonCell.Value = "Export File";
buttonCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Rows[i].Cells[cell.ColumnIndex] = buttonCell;
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Grid Validation Error: " + ex.Message);
}
}
private bool TryParseBinary(string p)
{
try
{
string path = "C:\\Temp\\" + DateTime.Now.Ticks.ToString() + ".test";
byte[] bytes = Convert.FromBase64String(p);
File.WriteAllBytes(path, bytes);
//File.Delete(path);
return true;
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
return false;
}
}
private void dataGridView1_RowsAdded(对象发送方,DataGridViewRowsAddedEventArgs e)
{
按钮1.ForeColor=颜色。红色;
尝试
{
对于(int i=0;i
“锥虫线”是问题所在。它需要创建一个有效的文件来返回“true”,但我不知道如何使它足够聪明,以判断它刚才写的是不是一个有效的文件…好的,所以我能够创建一个解决方案来解决我的问题。这并不完全是我想要的,但它确实起到了作用。我为我的datagridview使用“DragDrop”方法检查datatable中是否存在“File”和“MIME”列。然后,如果这些列不存在,我将创建它们;如果存在,我将转换为Base64String的文件字节添加到“file”列,并将文件扩展名添加到“MIME”列。然后,我让“RowsAdded”事件将“File”单元格更改为按钮。然而,目前它没有保留文本“导出文件”,但我将继续这一部分的工作,这似乎是一个简单的修复。下面是我的代码:
private void dataGridView1_DragDrop(object sender, DragEventArgs e)
{
try
{
Point cursorPosition = dataGridView1.PointToClient(Cursor.Position);
DataGridView.HitTestInfo info = dataGridView1.HitTest(cursorPosition.X, cursorPosition.Y);
tableFactory = new data.TableFactory(TablesDropDown.SelectedValue.ToString());
tableFactory.LoadTable(dbPath);
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (DataColumn col in tableFactory.Table.Columns)
{
if (col.ColumnName != "MIME" && col.ColumnName != "File")
{
tableFactory.NewColumn("MIME", ColumnTypes.String);
tableFactory.NewColumn("File", ColumnTypes.String);
tableFactory.SaveTable(dbPath);
ColumnsDataGrid();
dataGridView1.Rows[info.RowIndex].Cells["File"].Value = Convert.ToBase64String(GetFile(files));
FileInfo f = new FileInfo(files[0]);
dataGridView1.Rows[info.RowIndex].Cells["MIME"].Value = f.Extension;
}
else
{
dataGridView1.Rows[info.RowIndex].Cells["File"].Value = Convert.ToBase64String(GetFile(files));
FileInfo f = new FileInfo(files[0]);
dataGridView1.Rows[info.RowIndex].Cells["MIME"].Value = f.Extension;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("This was not a valid file to store in the database. Error Msg: " + ex.Message);
}
}
private byte[] GetFile(string[] files)
{
byte[] bytes = null;
foreach (string file in files)
{
FileInfo fileInfo = new FileInfo(file);
if (File.Exists(file))
{
bytes = File.ReadAllBytes(file);
}
}
return bytes;
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
button1.ForeColor = Color.Red;
try
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
foreach (DataGridViewColumn col in dataGridView1.Columns)
{
if (col.Name == "File")
{
var buttonCell = new DataGridViewButtonCell();
buttonCell.Value = "Export File";
buttonCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Rows[i].Cells[col.Index] = buttonCell;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Grid Validation Error: " + ex.Message);
}
}
private void dataGridView1\u DragDrop(对象发送方,DragEventArgs e)
{
尝试
{
Point cursorPosition=dataGridView1.PointToClient(Cursor.Position);
DataGridView.HitTestInfo=dataGridView1.HitTest(cursorPosition.X,cursorPosition.Y);
tableFactory=新数据.tableFactory(TableDropdown.SelectedValue.ToString());
tableFactory.LoadTable(dbPath);
if(例如Data.GetDataPresent(DataFormats.FileDrop))
{
string[]files=(string[])e.Data.GetData(DataFormats.FileDrop);
foreach(tableFactory.Table.Columns中的DataColumn列)
{
if(col.ColumnName!=“MIME”&&col.ColumnName!=“文件”)
{
tableFactory.NewColumn(“MIME”,ColumnTypes.String);
tableFactory.NewColumn(“文件”,ColumnTypes.String);
tableFactory.SaveTable(dbPath);
ColumnsDataGrid();
dataGridView1.Rows[info.RowIndex].Cells[“文件”].Value=Convert.ToBase64String(