程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#中使用Spread6.0全攻略

C#中使用Spread6.0全攻略

編輯:關於C語言
(一)在C#中加載Spread6.0

nmd002版《C#加載Spread6.0全攻略》

首先,在引用裡加載Spread6.0的Dll文件。
(如果你先安了C#,再安的Spread有可能不用加載,是自動引用的。)
其次,在控件箱裡選擇一個准備放置Spread控件的選項卡,
在裡面點擊右鍵,選擇"添加/移除項",如果你的機器不夠快,請先上廁所。
然後,在對話框的"COM組件"裡找
"FarPoint Spread 6.0",
"FarPoint Spread 6.0 (OLEDB)",
"FarPoint Spread PrevIEw 6.0",
"FarPoint Spread PrevIEw 6.0 (OLEDB)",
這四個選項打鉤鉤。
最後,點確定。
這樣,在你的控件箱的當前選項卡裡就會出現Spread的四個控件,
其他用法一如在VB裡的使用。

最後,我要強調的是,Spread6.0本身雖然兼容C#,但是並不是為C#而設計的,
雖然在C#中能夠使用,但是卻要幾經變換,諸多彎路,並不比在VB下開發容易,
反而顯得更格格不入和困難。除非客戶強烈要求,不然還是不要在C#下用它了!

=====================================
上面的內容和下面的內容都是本人在C#的Form應用裡寫過的,Web應用沒試過。
請根據需要自行選用,另外請在別處轉帖時,保留作者nmd002的署名,謝謝!
=====================================


(二)在C#中使用Spread6.0

nmd002版《C#使用Spread6.0全攻略》

有些人會說,在C#裡用Spread有什麼了不起,不是跟VB裡用一樣簡單嗎?

能說這種話的人一般會有兩種情況:
一種人從沒做過,想當然地說;另一種人做過很多,必然這麼說。

沒錯,原理是一樣的,根本沒有出入。但是實際做起來,就是兩回事了。

“C#中使用Spread的最大問題不是Spread的使用方法有所改變,
而是全新類型的結果集(DataSet)的數據如何在Spread中顯示出來。”

真正用Spread做過項目的人都知道,Spread主要不是用來綁定數據,
而是用來顯示和接收數據的,因為數據的輸入大部分都需要校驗,
而綁定是一種在校驗時缺乏靈活性的手段,不利於數據的安全。

那麼C#中的結果集和VB裡的結果集有什麼不同呢?
C#裡的結果集是以XML的形式保存在對象中的,
而VB的結果集則是以數組的形式保存在對象中的。

<NewDataSet>
<authors>
<au_id>172-32-1176</au_id>
<au_lname>White</au_lname>
<au_fname>Johnson</au_fname>
<phone>408 496-7223</phone>
<address>10932 Bigge Rd.</address>
<city>Menlo Park</city>
<state>CA</state>
<zip>94025</zip>
<contract>true</contract>
</authors>
<authors>
<au_id>213-46-8915</au_id>
<au_lname>Green</au_lname>
<au_fname>MarjorIE</au_fname>
<phone>415 986-7020</phone>
<address>309 63rd St. #411</address>
<city>Oakland</city>
<state>CA</state>
<zip>94618</zip>
<contract>true</contract>
</authors>
......
<authors1>
<Column1>23</Column1>
</authors1>
</NewDataSet>

這就是將某個DataSet中的內容轉換後顯示出來的實例字串,其中凡是<authors>標簽的就是這個結果集中第一個表的記錄內容,而<authors1>標簽內的內容就是這個結果集中另外一個表的記錄內容。
由此可見,DataSet的內容是保存在一個以<NewDataSet>標簽定義的XML字串中的。
不同的表用不同的名稱作標簽來區別,每個表的每條記錄都以各自的字段名為標簽,標識自己的字段值。
所以,如果你想做到:把指定表中的值讀出來,寫入Spread的單元格中,只要學會在DataSet中取出指定表的全部記錄,並將值寫入對應單元格即可。

本人實踐後成功的方法有二:
1、雙循環直接從DataSet中取值填入對應的Spread單元格。

axvASPread1.MaxRows = rs.Tables[tablename].Rows.Count;
axvASPread1.MaxCols = rs.Tables[tablename].Columns.Count;
axvASPread1.Row=1;
axvASPread1.Col=1;
axvaSpread1.Row2=axvASPread1.MaxRows;
axvaSpread1.Col2=axvASPread1.MaxCols;

int i,j;
for(i=1;i<=rs.Tables[tablename].Rows.Count;i++)
{
  for(j=1;j<=rs.Tables[tablename].Columns.Count;j++)
    {
      axvASPread1.Row=i;
      axvASPread1.Col=j;
      axvASPread1.Value =rs.Tables[tablename].Rows[i-1][j-1].ToString();
}
}
//本例中rs為DataSet對象,axvaSpread1為VASPread對象實例。
//tablename為指定表名。

2、通過取得DataSet的XML字串,並將其轉化為一張二維表(用“水平制表符”區分字段,用“換行符”區分記錄的大字串),將其作為VB的結果集在剪貼板中的考貝內容,直接寫入Spread對象。

axvASPread1.MaxRows = rs.Tables[tablename].Rows.Count;
axvASPread1.MaxCols = rs.Tables[tablename].Columns.Count;
axvASPread1.Row=1;
axvASPread1.Col=1;
axvaSpread1.Row2=axvASPread1.MaxRows;
axvaSpread1.Col2=axvASPread1.MaxCols;

string xmlstr=rs.GetXML().ToString();
string steatstr="\\</" + tablename + "\\>";
//生成一個記錄節點的替換串"\</authors\>"
//使用正則表達式轉換XML為axvASPread1.Clip可接受格式的字串
xmlstr=Regex.Replace(XMLstr, @"[\n\r\v\t]*", "");
//去掉串中所有的空格以外的無用空白符:回車,換行,水平制表符,垂直制表符。有多少去多少
xmlstr=Regex.Replace(XMLstr, @"\<(|/)NewDataSet\>", "");
//去掉DataSet所生成XML串的:固定的起始標簽<NewDataSet>和固定的結束標簽</NewDataSet>
xmlstr=Regex.Replace(XMLstr, @"\<([^/]*)\>", "");
//去掉XML串的全部起始標簽:<NewDataSet>,<au_id>,<city>,<authors>.....
xmlstr=Regex.Replace(XMLstr, @steatstr, "\r");
//將指定表記錄的結束標簽換成換行符:</authors> => \r
xmlstr=Regex.Replace(XMLstr, @"\</[\w]*\>", "\t");
//將其它內容的結束標簽換成水平制表符:</au_id> => \t
axvASPread1.Clip=XMLstr;//數據內容置入Spread對象

//Regex是個正則對象,其它同上。

其實根據上面的思想,還有其它方法可尋,比如自定一個類,存儲結構完全等同於VB的結果集存儲結構,再寫個方法專門置入和取出,只要你對RecordSet了解的夠多,完全沒有問題。
或者通過其他方法,只要實現了DataSet和RecordSet的內容轉換,想怎麼實現都行。
畢竟抓住老鼠就是好貓嘛!
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved