站內文章

2014年11月28日 星期五

找不到檔案或組件名稱 System.Data.SqlServerCe

問題:
找不到檔案或組件名稱 'System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=3BE235DF1C8D2AD3' 或其相依性的其中之一。

網路上找到有兩種解法(我是用解法一解決)

解法一
把sqlce.wce5.armv4i.CAB放到裝置上面安裝即可

sqlce.wce5.armv4i.CAB的路徑在
C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i

解法二
將System.Data.SqlServerCe.dll、sqlceca35.dll、sqlcecompact35.dll、 sqlceer35CN.dll、sqlceme35.dll、sqlceoledb35.dll、sqlceqp35.dll、sqlcese35.dll、System.Data.SqlClient.dll這幾個檔案丟到裝置上跟應用程式同一個目錄中

原文 http://www.myexception.cn/system/425538.html

2014年11月27日 星期四

System.Text.Encoding.Default 產生亂碼


最近在處理簽章遇到了這個問題,產生的簽章格式是bytearray,想轉成string
一開始用了 string str = System.Text.Encoding.Default.GetString ( byteArray );
結果發現產生的string是亂碼,後來用下面這個方式解決
ByteArrayToHexString


    private string ByteArrayToHexString(byte[] data)
    {
        StringBuilder sb = new StringBuilder(data.Length * 3);
        foreach (byte b in data)
            sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
        return sb.ToString().ToUpper();
    }

2014年11月26日 星期三

String直接換成Bytes


string 長怎樣,轉過去bytes就怎樣
限制string長度必須為偶數

    protected byte[] StringToBytes(string HexString)
    {
        int byteLength = HexString.Length / 2;
        byte[] bytes = new byte[byteLength];
        string hex;
        int j = 0;
        for (int i = 0; i < bytes.Length; i++)
        {
            hex = new String(new Char[] { HexString[j], HexString[j + 1] });
            bytes[i] = HexToByte(hex);
            j = j + 2;
        }
        return bytes;
    }

    private byte HexToByte(string hex)
    {
        if (hex.Length > 2 || hex.Length <= 0)
            throw new ArgumentException("hex must be 1 or 2 characters in length");
        byte newByte = byte.Parse(hex, System.Globalization.NumberStyles.HexNumber);
        return newByte;
    }

2014年11月20日 星期四

2014年11月19日 星期三

VS 背景顏色


這邊分享我在用的兩個背景設定,一個2008,一個2010

下載完操作
工具->匯入匯出

for VS2008 點我下載



for VS2010 點我下載

SQL Count 計算資料庫內特定資料的筆數


這邊提供的方法是利用ExecuteScalar指令取出執行完SqlCommand的值

// ExecuteScalar:
// 執行查詢,並傳回查詢所傳回的結果集第一個資料列的第一個資料行。 會忽略其他的資料行或資料列。
// 關於ExecuteScalar 更多的說明 http://goo.gl/xtV64S
    using (SqlCommand cmd = new SqlCommand("SELECT COUNT(Import_Date) FROM ComparisonData WHERE Import_Date='" + time1 + "'", SqlConn)) // 看ComparisonData內有幾組相同的Import_Date
    {
        string time2 = Convert.ToDateTime(saveNow).ToString("yyyyMMdd");
        Lot_Number = "P" + time2 + (Convert.ToInt16(cmd.ExecuteScalar()) + 1).ToString("d4"); //批次號碼 - P+8碼西元年月日+4碼流水編號
    }

2014年11月14日 星期五

datagridview 自動填滿、及排序


    // 顯示DataGridview1
    using (SqlDataAdapter da = new SqlDataAdapter("Select Company_Number AS 公司編號  ,Date AS 日期 , " +
        " Case when Path = 1 then '入庫' when Path = 0 then '出庫' END AS 進出庫 , " +
        " Case when Authorize = 1 then '成功' when Authorize = 0 then '失敗' END AS  驗證 , " +
        " Case when State = 1 then '舊品' when State = 0 then '新品' END AS  新舊 " +
        " From DoorPort", conn))
    {
        DataTable sqldt = new DataTable();
        da.Fill(sqldt);
        dataGridView1.DataSource = sqldt;
        // datagridview 以 入庫時間排序 (最新一筆在最上面)
        dataGridView1.Sort(dataGridView1.Columns[1], System.ComponentModel.ListSortDirection.Descending);
        // gridview自動充滿顯示區
        dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    }

比較時間差異

這邊提供三個方式
1. 比較時間前後 使用 DateTime.Compare
// 參考來源 http://goo.gl/Ay5hAE
using System;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
      DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
      int result = DateTime.Compare(date1, date2);
      string relationship;

      if (result < 0)
         relationship = "is earlier than";
      else if (result == 0)
         relationship = "is the same time as";         
      else
         relationship = "is later than";

      Console.WriteLine("{0} {1} {2}", date1, relationship, date2);
   }
}
// The example displays the following output: 
//    8/1/2009 12:00:00 AM is earlier than 8/1/2009 12:00:00 PM



2. 比較時間差異 使用 SQL語法
// http://goo.gl/nTQX3D 每日一SQL-善用DATEADD和DATEDIFF
// http://goo.gl/PrB0JC 如何用簡單的 SQL 技巧取得特定日期是否為週末假日

SELECT DATEDIFF(DAY, '2010-10-03','2010-10-04'  )
// 出來的結果就是 1,代表相隔一天。



2. 比較時間差異 使用 TimeSpan
    DateTime ts1 = Convert.ToDateTime(sqlDDT.Rows[0][1].ToString()); // 取得datatable欄位資料並轉時間格式
    DateTime ts2 = DateTime.Now; // 抓取現在時間
    Double ts = new TimeSpan(ts2.Ticks - ts1.Ticks).TotalSeconds;
    if (ts >= 60)// 判斷時間差異 時間差大於60秒 則執行
    {
       // do
    }
// 關於 TimeSpan 的屬性使用可以參考
// http://goo.gl/NqvtYy
// Hours 與 TotalHours 是有差別的(前者是只有比較Hours後者則是算整個的時間差-會包含日的換算)

2014年11月4日 星期二

隱藏Winform中的最大化、最小化、關閉按鈕


網路上有兩種方式,一種是利用把按鈕變成灰色(不能按)
另一種則是讓它消失


讓按鈕變灰色
// 參考來源 RiCo技術農場
// http://www.dotblogs.com.tw/ricochen/archive/2009/10/22/11199.aspx

[DllImport("user32.dll")]
public static extern int GetSystemMenu(Int32 hWnd, Int32 bRevert);
[DllImport("user32.dll")]
public static extern int RemoveMenu(Int32 hMenu, Int32 nPosition, Int32 wFlags);
 
private void Form1_Load(Object sender, EventArgs e)
{
    Int32 ControlBoxMenu;
    const Int32 MF_BYPOSITION = 1024;//&H400
    ControlBoxMenu = GetSystemMenu(Handle.ToInt32(), 0);
    RemoveMenu(ControlBoxMenu, 6, MF_BYPOSITION);        
}


讓按鈕整個消失

將Winform的ControlBox的屬性設置成false即可

2014年10月27日 星期一

連接資料庫並新增資料表及填入資料



                // 設定資料庫路徑
                string path = @"C:\Documents and Settings\lict\My Documents\WindowsCE My Documents\FixRepair.sdf";
                string constrpda = "DataSource=" + path;
                // 連接資料庫
                using (SqlCeConnection conn = new SqlCeConnection(constrpda))
                {
                    conn.Open();
                    // 建立資料表 ComparisonDataPDA 欄位 Total(存放原先資料庫裡應有的數量) ; Type (設備種類) ; Lot_Number (批次號碼)
                    using (SqlCeCommand Cmd = new SqlCeCommand("CREATE TABLE ComparisonDataPDA(Total nvarchar(20),Type nvarchar(20),Lot_Number nvarchar(50))", conn))
                    {
                        Cmd.ExecuteNonQuery();
                        Cmd.Dispose();
                        // 將設備數量、設備種類、批次號碼 寫進資料庫
                        using (SqlCeCommand adcmd = new SqlCeCommand("Insert into ComparisonDataPDA(Total,Type,Lot_Number) values('20','0','P20141012001')", conn))
                        {
                            adcmd.ExecuteNonQuery();
                            adcmd.Dispose();
                        }
                    }
                }

讓Form 2 Show出來的時候跟Form 1位置一樣



                                // 跳轉到 homepage 
                                this.Hide(); 
                                HomePage home = new HomePage(); // 把要跳轉過去的頁面new出來 -> home
                                // 把目前頁面位置存到home page
                                home.StartPosition = FormStartPosition.Manual;
                                home.Location = new Point(this.Location.X, this.Location.Y);
                                home.Show();

將PC檔案移動至PDA中


原本是想直接從本機讀取PDA裡面的資料庫,結果好像目前還沒有方式能找到PDA路徑
後來就找到了OpenNETCF這個方式,可以copy檔案至PDA 或者從PDA copyfile到PC
雖然說多了一個copy的步驟,但總算解決了要讀到PDA裡面檔案的問題

我的方法用到 OpenNETCF.Desktop.Communication
網路上目前也有很棒的教學(我是看這篇才會的@@) 點我前往
網站上是教你從 OpenNETCF Desktop Communication Library 開始編譯
有興趣就可以上去看看

這邊我直接附上編譯好的 dll  點我下載


                using OpenNETCF.Desktop.Communication; // 需引入 .dll

                string path = @"C:\Documents and Settings\lict\My Documents\WindowsCE My Documents\InBoundPDA.sdf";
                RAPI m_rapi = new RAPI(); ; // 宣告 RAPI 物件
                m_rapi.Connect(true);  // 建立與裝置的同步連接
                // 判斷是否連線
                try
                {
                    if (!m_rapi.Connected)
                    {
                        MessageBox.Show("尚未與裝置連線!");
                        return;
                    }
                    // 將下載的檔案(原本在本機) copy 到 PDA上
                    m_rapi.CopyFileToDevice(path, @"\DB\InBoundPDA.sdf", true); // PC的檔案複製到裝置
                    m_rapi.Disconnect();  // 中斷與裝置的連接
                    File.Delete(path); // 刪除本機檔案
                    MessageBox.Show("下載完成!");

                    // 將PDA的檔案 copy 到 電腦上
                    // m_rapi.CopyFileFromDevice(path, @"\DB\FixTest.sdf", true);

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }


附上libray的使用方式
Connect 建立與裝置的同步連接。
CopyFileFromDevice 將裝置中的檔案複製到 PC。
CopyFileOnDevice 將裝置某個位置的檔案複製到裝置的另一新位置。
CopyFileToDevice 將 PC 中的檔案複製到裝置。
CreateDeviceDirectory 在裝置中創建目錄。
CreateProcess 啟動裝置中的應用程式。
DeleteDeviceFile 刪除裝置中的檔案。
DeviceFileExists 檢查裝置中是否存在檔案。
Disconnect 中斷與裝置的連接。
EnumFiles 提供與 FileName 參數提供的條件相匹配的 FileInformation 清單。
GetDeviceCapabilities 檢索裝置的特定裝置訊息。
GetDeviceFileAttributes 檢索特定裝置檔案的屬性。
GetDeviceFileSize 檢索裝置檔案的大小,以位元組為單位。
GetDeviceFileTime 檢索裝置檔案的日期時間。
GetDeviceMemoryStatus 檢索裝置的記憶體狀態。
GetDeviceSystemFolderPath 檢索到裝置系統檔案夾的路徑。
GetDeviceSystemInfo 檢索裝置的系統詳細訊息。
GetDeviceSystemPowerStatus 檢索裝置的電源狀態。
GetDeviceVersion 檢索裝置的作業系統版本。
MoveDeviceFile 將現有裝置檔案移到或重命名到一個新位置。
RemoveDeviceDirectory 刪除裝置中的目錄。
SetDeviceFileAttributes 設定裝置中檔案的屬性。
SetDeviceFileTime 設定裝置中檔案的日期時間。


文末附上之前看到可以找執行檔案位置的方法
原本還以為這是可以抓PDA的位置-.- 結果不行
不過他能抓到PDA的執行檔案位置(在PDA執行時),如果再PC執行則是抓PC的執行檔位置


                foreach (string dir in Directory.GetDirectories("\\"))
                {
                    if (((new DirectoryInfo(dir)).Attributes & FileAttributes.NotContentIndexed) > 0)
                    {
                        // dir 即是 執行檔案的位置
                        // 可用相對路徑來取得你要的檔案位置
                    }
                }

在datagridview中產生按鈕進行點選


一開始先在pageload建立按鈕

                // 建立 PDA下載 按鈕
                // new 一個datagridview的欄位 名稱為DownPDA
                DataGridViewButtonColumn DownPDA = new DataGridViewButtonColumn(); 
                DownPDA.HeaderText = "PDA下載"; // 按鈕名稱
                DownPDA.CellTemplate.Style.BackColor = Color.Pink; // 設定按鈕顏色
                dataGridView1.Columns.Insert(8,DownPDA); // 在第8欄插入 剛建好的按鈕欄位
                (dataGridView1.Columns[8] as DataGridViewButtonColumn).DefaultCellStyle.NullValue = "PDA下載";

                // gridview自動充滿顯示區
                // 調整可參考 http://www.cnblogs.com/scottckt/archive/2007/10/09/917874.html
                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

建一個datagridview的 CellClick (接受點擊事件)


        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // 如果點了第8欄則進行
            if (e.ColumnIndex == 8)
            {
                // 抓取點選那一行的 第1欄位的資料 (補充:欄位是從0起始開始數)
                string DeviceLotNM = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
                // 抓取點選那一行的 第2欄位的資料
                string DeviceCount = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();
            }
        }

2014年10月20日 星期一

VS 事件日誌檔已滿

解決辦法

我的電腦右鍵->管理->系統工具->事件檢視器->應用程式右鍵->清除所有事件


gridview中以TemplateField新增button來做刪除row的動作


我的做法是用TemplateField的資料行自己抓一個button命名"刪除"
將資料庫的資料砍掉,再更新一次Gridview,網路上也有其他不同的做法
這邊分享一篇同樣是刪除動作的教學文章
http://blog.finalevil.com/2008/11/aspnetgridview03.html

本文這個方法需要建gridview的RowCommand和RowDeleting


原始檔修改

                       
                   



程式碼
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        int index = Convert.ToInt32(e.CommandArgument);//取得點選的index y軸
        GridViewRow selectedRow = GridView1.Rows[index];//取得x軸
        TableCell device_lot_num = selectedRow.Cells[1];//取得批次編號欄位
        switch (e.CommandName)//取得x軸點選的button
        {
            case "Delete"://刪除
                // 連接資料庫
                SqlConnection SqlConn = new SqlConnection();
                SqlConn.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\VS20141001\\App_Data\\TPC_Transformers.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
                SqlConn.Open();
                // 刪除 MaterialCollarManagement 資料表中 所選取刪除的資料(以 批次編號Collar_Number為條件 )
                SqlCommand Cmd = new SqlCommand("Delete From MaterialCollarManagement where Collar_Number = '" + device_lot_num.Text + "'", SqlConn);
                // 執行刪除指令
                Cmd.ExecuteNonQuery();
                Cmd.Dispose();
                break;
            default:
                break;
        }
    }


    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        // 重新將資料庫的資料讀到datatable並bind進去gridview
        DataTable dt3 = new DataTable();
        SqlConnection SqlConn = new SqlConnection();
        SqlConn.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\VS20141001\\App_Data\\TPC_Transformers.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
        SqlConn.Open();
        SqlDataAdapter da = new SqlDataAdapter("Select ROW_NUMBER() OVER(ORDER BY Collar_Number DESC) AS Row,Collar_Number,Transformer_Amount,Switch_Amount,Apply_Date,Collar_User,Authorize_User, " +
        "Case when Authorize = 0 then '未核准' when Authorize = 1 then '核准' END AS Authorize, " +
        "Case when Depot = 0 then '出庫' when Depot = 1 then '在庫' END AS  Depot " +
        "From MaterialCollarManagement Where Authorize = '0'", SqlConn);
        da.Fill(dt3);
        GridView1.DataSource = dt3;
        GridView1.DataBind();
        SqlConn.Close();
    }

建立 .sdf 檔案


這邊會用到 System.Data.SqlServerCe
需支援 Visual Studio 2010 SP1

        
        // path = 欲建立檔案的路徑
        // 附註 這邊的路徑中 有用到 反斜線 \ 都得用兩個 反斜,否則會出現 "無法辨認的逸出序列" 的錯誤
        // 關於這個錯誤可以參考 http://msdn.microsoft.com/zh-tw/library/44ezxxy3
        string path = "D:\\Documents and Settings\\Bisger\\My Documents\\WindowsCE My Documents\\test.sdf";
        string constrpda = "DataSource=" + path;
        if (!File.Exists(path)) // 如果路徑path的檔案不存在則執行
        {
            SqlCeEngine engine = new SqlCeEngine(constrpda);
            engine.CreateDatabase();
        }

// 這邊也補上刪除檔案的指令
       File.Delete(path); 




如果出現 命名空間 'System.Data' 中沒有型別或命名空間名稱 'SqlServerCe' (您是否遺漏了組件參考?)
該組件存在 system.data.sqlserverce.dll,其路徑為
『C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Desktop\System.Data.SqlServerCe.dll』,視版本,4.0 存在
『C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.dll』,只要將這個 DLL 加入參考就可以正常使用了。
32位元版則在『C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Desktop\System.Data.SqlServerCe.dll』與
『C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.dll』
若找不到以上所述路徑,代表你的電腦沒有裝 SQLCE 啦!
請至 Microsoft Download Center 下載。3.5版、4.0版
文章參考來源

2014年10月17日 星期五

import excel to datatable


之前在網路上查到的,臨時找不回那篇文章,只留當初找到的那個檔案
直接下載這個專案檔去試試看就知道了~
點我下載 ImportExcelData.zip

將excel資料匯入datatable中

主功能程式碼如下
            if (FileUpload1.HasFile)
            {
                string connectionstring = "";
                string filename = Path.GetFileName(FileUpload1.PostedFile.FileName);
                string fileextension = Path.GetExtension(FileUpload1.PostedFile.FileName);
                string filelocation = Server.MapPath("~/file/") + filename;
                FileUpload1.SaveAs(filelocation);
                if (fileextension == ".xlsx")
                {
                    connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filelocation + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=2\"";
                    OleDbConnection conn = new OleDbConnection(connectionstring);
                    OleDbCommand cmd = new OleDbCommand();
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = "select * from [Sheet1$]";
                    cmd.Connection = conn;
                    OleDbDataAdapter oda = new OleDbDataAdapter(cmd);
                    System.Data.DataTable dt = new System.Data.DataTable();
                    oda.Fill(dt);
                    Gridview1.DataSource = dt;
                    Gridview1.DataBind();
                }
            }
            else
            {
                BtnUpload.Attributes.Add("OnClientClick", "javascript:alert('Select Excel file');");
                Gridview1.DataSource = null;
                Gridview1.DataBind();
            }
            FileUpload1.Attributes.Clear();

gridview export excel

參考書籍 微軟MVP的ASP.NET 4.5專題實務I p11-7
書上光碟有附很多範例,如果真要買這方面的書,蠻推薦這本的@@



這是使用NPOI1.2.4版來匯出EXCEL(其他版本可能不適用)
所以一開始得先抓一下NPOI的Library
點我下載 NPOI 1.2.4 Library

抓完後再專案那右鍵->加入參考


//== NPOI的宣告 ==================
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.SS.UserModel; 
//===============================

        //== 本範例的資料來源:http://msdn.microsoft.com/zh-tw/ee818993.aspx 
        //== http://tonyqus.sinaapp.com/archives/73  (v.1.2.4版)
        HSSFWorkbook workbook = new HSSFWorkbook();
        //=======================================(v.1.2.4版)
        //== 新增試算表 Sheet名稱。使用 NPOI.SS.UserModel命名空間。
        ISheet u_sheet = (ISheet)workbook.CreateSheet("My Sheet_124");
        //=======================================
 
        //===============================================(主要功能start)
        //== 利用迴圈,把gridview的資料 一個一個 寫入 Excel各個儲存格裡面。
        for (int a = 0 ; a < GridView1.Rows.Count ; a++) // gridview的row
        {
            //**** 先建好一列(Row),才能去作格子(Cell)
            IRow u_Row = u_sheet.CreateRow(a+1);
            for (int i = 0; i < GridView1.Rows[a].Cells.Count; i++) //gridview的column
            {
               //== .CreateCell() 可設定為同一列(Row)的 [第幾個格子]
               u_Row.CreateCell(i).SetCellValue(GridView1.Rows[a].Cells[i].Text);
            }
        }
        //===============================================(主要功能end)
        MemoryStream ms = new MemoryStream();  //==需要 System.IO命名空間
        workbook.Write(ms);
        //== Excel檔名,請寫在最後面 filename的地方
        Response.AddHeader("Content-Disposition", "attachment; filename=申請書.xls");
        Response.BinaryWrite(ms.ToArray());

        //== 釋放資源
        workbook = null;   //== VB為 Nothing
        ms.Close();
        ms.Dispose();

        //== 如果要寫在 Web Server的硬碟裡面,請參閱上一個範例 NPOI_01_new_v124.aspx。
    }



// 最後面這邊補上單一欄位新增的方式

        //**** CreateRow()方法,只有這一列的「第一格子」可以這樣用。(v.1.2.4版 的新變化)
        // 每一列的第0個值
        u_sheet.CreateRow(0).CreateCell(0).SetCellValue("0000"); // 第0列 第0欄
        u_sheet.CreateRow(1).CreateCell(0).SetCellValue("1111"); // 第1列 第0欄
        //== 以下在  (v.1.2.1版,正常) 在 目前這個版本會異常
        //u_sheet.CreateRow(6).CreateCell(1).SetCellValue("6666");  // 第6列 第1欄
        //u_sheet.CreateRow(6).CreateCell(2).SetCellValue("7777");

        //== 如果要「讀取」某個格子,請用 .GetCell(index)方法

        //**********************************************************(start)
        //**** v.1.2.4版在此有很大的改變!!!請看 http://tonyqus.sinaapp.com/archives/73  
        IRow u_Row= u_sheet.CreateRow(6);    //== 先用 IRow介面,建立全新的一列。 第6列
        //== .CreateCell() 可設定為同一列(Row)的 [第幾個格子]
        u_Row.CreateCell(1).SetCellValue("6666");   // 第6列 第1欄 新增 6666
        u_Row.CreateCell(2).SetCellValue("7777");   // 第6列 第2欄 新增 7777




這邊再分享一個匯出時可以去除girdview裡面的 "& nbsp;" 以及新增第一行欄位名稱

    protected void Button1_Click(object sender, EventArgs e)
    {
        // 去除girdview裡面的 " "
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            for (int j = 0; j < GridView1.Rows[i].Cells.Count; j++)
            {
                if (GridView1.Rows[i].Cells[j].Text == " ")
                {
                    GridView1.Rows[i].Cells[j].Text = "";
                }
            }
        }
        //== 本範例的資料來源:http://msdn.microsoft.com/zh-tw/ee818993.aspx 
        //== http://tonyqus.sinaapp.com/archives/73  (v.1.2.4版)

        HSSFWorkbook workbook = new HSSFWorkbook();

        //=======================================(v.1.2.4版)
        //== 新增試算表 Sheet名稱。使用 NPOI.SS.UserModel命名空間。
        ISheet u_sheet = (ISheet)workbook.CreateSheet("My Sheet_124");
        //=======================================
   
        //===============================================(start)
        //== 利用迴圈,把資料寫入 Excel各個儲存格裡面。
        for (int a = -1 ; a < GridView1.Rows.Count ; a++) // +1個 欄位名稱的 row
        {
            //**** 先建好一列(Row),才能去作格子(Cell)
            IRow u_Row = u_sheet.CreateRow(a+1);
            if (a == -1) //第 0 列要顯示欄位名稱
            {
                // 第0列新增欄位名稱
                u_Row.CreateCell(0).SetCellValue("項目號碼"); // 第0欄
                u_Row.CreateCell(1).SetCellValue("檢修品名稱"); // 第1欄
                u_Row.CreateCell(2).SetCellValue("規格");
                u_Row.CreateCell(3).SetCellValue("數量");
                u_Row.CreateCell(4).SetCellValue("單位");
                u_Row.CreateCell(5).SetCellValue("試驗項目");
                u_Row.CreateCell(6).SetCellValue("良");
                u_Row.CreateCell(7).SetCellValue("不良");
                u_Row.CreateCell(8).SetCellValue("備註");
            }
            else
            {
                for (int i = 0; i < GridView1.Rows[a].Cells.Count; i++)
                {
                    //== .CreateCell() 可設定為同一列(Row)的 [第幾個格子]
                    u_Row.CreateCell(i).SetCellValue(GridView1.Rows[a].Cells[i].Text);
                }
            }
        }
        //===============================================(end)

        MemoryStream ms = new MemoryStream();  //==需要 System.IO命名空間
        workbook.Write(ms);
        //== Excel檔名,請寫在最後面 filename的地方
        Response.AddHeader("Content-Disposition", "attachment; filename=材料課委試報告書.xls");
        Response.BinaryWrite(ms.ToArray());

        //== 釋放資源
        workbook = null;   //== VB為 Nothing
        ms.Close();
        ms.Dispose();
        //== 如果要寫在 Web Server的硬碟裡面,請參閱上一個範例 NPOI_01_new_v124.aspx。
    }

2014年10月16日 星期四

在gridview顯示之前,判斷資料並顯示不同狀況


使用SQL的case


一開始先在gridview上的boundfield物件中,設定其datafield來源(為資料表的名稱)



//SELECT CASE ("欄位名")
//  WHEN "條件1" THEN "結果1"
//  WHEN "條件2" THEN "結果2"
//  ...
//  [ELSE "結果N"]
//  END
//FROM "表格名";

       da = new SqlDataAdapter("Select ROW_NUMBER() OVER(ORDER BY Collar_Number DESC) AS Row," +
            "Collar_Number,Transformer_Amount,Switch_Amount,Apply_Date,Collar_User,Authorize_User, " +
            "Case when Authorize = 0 then '未核准' when Authorize = 1 then '核准' END AS Authorize, " +
            "Case when Depot = 0 then '出庫' when Depot = 1 then '在庫' END AS  Depot " +
            "From MaterialCollarManagement Where Authorize = '0'", SqlConn);

// 當 Authorize = 0 會在gridview中datafield來源設定Authorize的物件上顯示 未核准
// 當 Depot = 1 會在gridview中datafield來源設定Depot的物件上顯示 在庫

SQL case 用法可以參考 http://www.1keydata.com/tw/sql/sql-case.html

datatable 與 gridview 抓值差異

// gridview1和 datatable 抓值有些許的差異
// 差在gridview在判斷column時需要用.cell抓

GridView1.Rows[0].Cells[1].ToString() // giidview 抓值
datatable1.Rows[0][1].ToString() // datatable 抓值