C#中使用Spread6.0全攻略
來源:互聯網
上載者:User
攻略 (一)在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\>"
//使用Regex轉換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的內容轉換,想怎麼實現都行。
畢竟抓住老鼠就是好貓嘛!