找回密码
 立即注册

QQ登录

只需一步,快速开始

mindrayguowei

中级会员

122

主题

274

帖子

986

积分

中级会员

积分
986

活字格认证

QQ
mindrayguowei
中级会员   /  发表于:2015-8-7 14:07  /   查看:6235  /  回复:9
窗体界面上拖了一个TextControl控件,从数据库中读取RTF格式的模板数据存入一个byte数组,把这个 byte数组Load到TextControl控件

在VB.NET里面:
TextControl.Load(bytes,TXTextControl.StreamType.RichTextFormat,loadsetting)
编译通过,模板能够成功加载。

在C#里面
TextControl.Load(bytes,TXTextControl.StreamType.RichTextFormat,loadsetting)  编译都通不过
报错信息:

错误        1        与“TXTextControl.TextControl.Load(byte[], TXTextControl.BinaryStreamType)”最匹配的重载方法具有一些无效参数        E:\Demo\TXDocPrint\TXDocPrint\Form1.cs
错误        2        参数 2: 无法从“TXTextControl.StreamType”转换为“TXTextControl.BinaryStreamType”        E:\Demo\TXDocPrint\TXDocPrint\Form1.cs

完全一样的参数,一样的byte数组,一样的StreamType枚举,一样的loadsetting

问题:
1.同样的控件,为什么会有这么大的差别?  难道针对不同的语言有两套DLL?
2.在C#里面,要怎么做才能成功加载一个从数据库里面读取到的RTF格式的模板?

谢谢

9 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2015-8-7 16:51:00
沙发
回复 1楼mindrayguowei的帖子

问题正在调查,稍后给您回复
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-8-9 16:59:00
板凳
回复 1楼mindrayguowei的帖子

抱歉,我并没有能找到1#中使用方法load的对应重载信息:
Untitled.png (72.27 KB, 下载次数: 86)
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2015-8-10 08:55:00
地板
没错,第二个参数确实应该是BinaryStreamType,但是神奇的是在VB里面,传StreamType.RichTextFormat是能够编译通过并且正确加载模板
以下是VB能够成功执行的代码片段,_templateContent 就是byte数组

Dim loadSetting As LoadSettings = New LoadSettings()
loadSetting.ApplicationFieldFormat = ApplicationFieldFormat.MSWord

loadSetting.ApplicationFieldTypeNames = New String() {"MERGEFIELD", &quotRINTDATE"}

TextControl.Load(_templateContent, StreamType.RichTextFormat, loadSetting)
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2015-8-10 15:38:00
5#
要怎么做才能在C#里面加载RTF格式的byte数组?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-8-10 17:04:00
6#
回复 5楼mindrayguowei的帖子

我理解需要使用一个中介文件来处理,目前我的进展是:

  1. private void loadToolStripMenuItem_Click(object sender, EventArgs e)
  2.         {
  3.             using (SqlConnection conn = new SqlConnection(sqlconnstr))
  4.             {
  5.                 conn.Open();
  6.                 DataTable dt = new DataTable();
  7.                 string sql = "select * from test";
  8.                 SqlDataAdapter ad = new SqlDataAdapter(sql,conn);
  9.                
  10.                 ad.Fill(dt);
  11.                 byte[] bts = (byte[])dt.Rows[3]["field2"];
  12.                 FileStream fs = new FileStream("test.rtf", FileMode.OpenOrCreate);
  13.                 fs.Write(bts, 0, bts.Length);
  14.                 //fs.get
  15.                 conn.Close();

  16.                 this.textControl1.Load(fs, TXTextControl.StreamType.RichTextFormat);
  17.                 fs.Close();
  18.             }
  19.         }

  20.         private void saveToolStripMenuItem_Click(object sender, EventArgs e)
  21.         {
  22.             FileStream st = new FileStream("test.rtf", FileMode.Create);

  23.             this.textControl1.Save(st, TXTextControl.StreamType.RichTextFormat);

  24.             byte[] bts = new byte[st.Length];

  25.             st.Read(bts, 0, bts.Length);
  26.             st.Close();

  27.             using (SqlConnection conn = new SqlConnection(sqlconnstr))
  28.             {
  29.                 conn.Open();
  30.                 SqlCommand cmd = new SqlCommand();
  31.                 cmd.Connection = conn;
  32.                 cmd.CommandText = "insert into test(field2) values(@bts)";
  33.                 SqlParameter par = new SqlParameter("@bts", SqlDbType.Image);
  34.                 par.Value = bts;
  35.                 cmd.Parameters.Add(par);
  36.                 int t = (int)(cmd.ExecuteNonQuery());
  37.                 if (t > 0)
  38.                 {
  39.                     Console.WriteLine("插入成功");
  40.                 }
  41.                 conn.Close();
  42.             }
  43.         }
复制代码


当前遇到一些困难,加载时候无法识别格式,已经和厂商进行沟通,我们也在加紧调查,有进一步结果第一时间通知您。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-8-11 11:24:00
7#
回复 5楼mindrayguowei的帖子

C# 加载数据库中的 rtf 格式文件,跑通了。需要通过本地文件进行中转:

  1. public void databaseFilePut()
  2.         {
  3.             byte[] file;
  4.             textControl1.Save("test.rtf", TXTextControl.StreamType.RichTextFormat);

  5.             using (var stream = new FileStream("test.rtf", FileMode.Open, FileAccess.Read))
  6.             {
  7.                 using (var reader = new BinaryReader(stream))
  8.                 {
  9.                     file = reader.ReadBytes((int)stream.Length);
  10.                 }
  11.                 stream.Close();
  12.             }
  13.             using (SqlConnection varConnection = new SqlConnection(sqlconnstr))
  14.             {
  15.                 varConnection.Open();
  16.                 SqlCommand sqlWrite = new SqlCommand("INSERT INTO test(field2) values(@bts)", varConnection);
  17.                 sqlWrite.Parameters.Add("@bts", SqlDbType.VarBinary, file.Length).Value = file;
  18.                 sqlWrite.ExecuteNonQuery();
  19.                 varConnection.Close();
  20.             }
  21.         }

  22.         
  23.         public void databaseFileRead()
  24.         {
  25.             var varConnection = new SqlConnection(sqlconnstr);
  26.             SqlDataAdapter ad=new SqlDataAdapter(@"SELECT * FROM TEST", varConnection);
  27.             DataTable dt = new DataTable();
  28.             ad.Fill(dt);
  29.             int rowIndex = dt.Rows.Count;

  30.             byte[] bytes = dt.Rows[rowIndex - 1][1] as byte[];
  31.             var fs = new FileStream("testLoad.rtf", FileMode.Create, FileAccess.Write);
  32.             fs.Write(bytes, 0, bytes.Length);
  33.             fs.Flush();
  34.             fs.Close();
  35.             this.textControl1.Load("testLoad.rtf", TXTextControl.StreamType.RichTextFormat);
  36.         }
复制代码


使用完文件后删除即可。
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2015-8-11 13:17:00
8#
只能用这种方法吗? 有尝试过我VB代码里面提到的方法吗?
我绝对VB里面能行,C#里面应该也可以的吧?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-8-11 18:28:00
9#
回复 8楼mindrayguowei的帖子

问题我重现了,确实可以这样写,我会和厂商沟通这个问题。

目前来看C#没有办法强制这样写。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-9-1 12:01:00
10#
回复 8楼mindrayguowei的帖子

VB.NET 能写厂商也没有给出具体原因,不过,厂商强烈建议不使用这种错误写法。

为了给你提供更优质的服务,请对本次服务进行评分。我们会认真对待你提出的宝贵意见,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部