轉帖|其它|編輯:郝浩|2011-11-10 10:04:43.000|閱讀 1008 次
概述:有些人會說,在C#里用Spread有什么了不起,不是跟VB里用一樣簡單嗎? 本次主要講述如何如何在C#中使用Spread6.0 ,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
有些人會說,在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的內容轉換,想怎么實現都行。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:網絡轉載