2011年9月27日 星期二

#VB Excel元件 資源釋放問題


'Excel 資源釋放問題,
發現說該宣告nothing的都宣告了
該 System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
也都呼叫了

變成說他會釋放,但不是立即

GC.Collect() : GC.WaitForPendingFinalizers()
宣告的位置很重要
因為叫用Excel元件在另外一個Form
該Form建立叫用完Excel元件以後
回到原本的Form,此時呼叫 GC
並且 WaitForPendingFinalizers
就可以完全釋放

目前測試還OK

2011年9月26日 星期一

#VB multiThreads 學習

感覺現在的東西如果要寫成多執行緒
變成全部都要改寫的樣子

要做跟不做......

如果切得不好,變成動畫跑不出來
(另一個 thread 主要工作要跑的夠久)

'要注意某些控件必須關閉功能
讓他不能做其他事.....那不是乾脆不要弄多執行緒
要再想想~

==========================================
測試 EXCEL 轉檔
目前會發生說多執行緒同時跑,
有機會碰到檔案名稱相同
變成多個執行緒有機會叫用同一個檔案名稱
什麼時候去判斷同檔名

發現說,有些Thread在判斷有沒有相同黨名的時候
會跟要殺TXT檔案的時候,兩個鄉衝

除非一開始就配好不重複的黨名
不然就是說確定所有執行緒跑完
一次全部殺掉
但是怎麼確定


用VB.NET實現多執行緒


VB.NET開發Thread Pool式網路芳鄰掃瞄程式
http://www.asp.com.tw/news/knowledge/1/info_tc1.htm
 '以要執行函數的位址為參數建立WaitCallback物件
            callBack = New WaitCallback(AddressOf Dog(I).Bark)
            '在QueueUserWorkItem時, 還可傳入一個Object作為呼叫該函數的參數
            '當然, 透過類別的Property也是另一種指定參數的作法, 而且更有彈性
            ThreadPool.QueueUserWorkItem(callBack, I)


'多工轉檔,目前做法會忽略異常資訊
只單純做轉檔部分
或是說需要另外紀錄在最後show出來之類的
要再想想看

'合併計算,可能要分兩部分走,
合併走共享資源變數,批次走區域變數
確定所有執行緒走完以後
回主執行緒做distinct, sum, order by 動作
有點麻煩,再看看好了

==========================================
測試 CR報表
目前卡在 開啟瀏覽報表 會提示要求輸入登入資料庫帳密 (之前沒有)
報表 DataSource 是一個 DataTable,應該是不會要求登入資料庫才對啊

@大概知道是因為他找不到登入資料庫的 DataSet
所以在報表上面重新設定好之前訂好的DataSet就可以了

再來就是多執行緒一次多開,會有 "引動過程的目標傳回例外狀況。"
multithreading - 'System.Reflection.TargetInvocationException'


 //若是已經取消背景作業,就不去更新表單資訊,
            //否則會引發 [引動過程目標例外狀況]。

@應該跟我關閉報表畫面後
thread 會被強制關閉之類的問題有關吧

看有沒有辦法說能在關閉報表之後
對thread做安全的關閉動作


@大概發現說
如果用的是全域Form去跑
不管事show,    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog  => 猜測是讀取同一個form,前一個thread還沒結束,下一個thread又呼叫這個form
怎樣都會發生

如果宣告 Form去跑
show 會發生    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog 還是會發生.....
@DisconnectedContext MDA警告?RuntimeCallableWrapper 
關閉報表表單以後,通常會出現這個警告訊息'

應該是跟 報表相關變數資源鏈結沒有適時關閉有關係


目前將呼叫的Thread 設為 STA 單一執行緒
似乎就不會再出現這個問題
要在測試看看


.NET Threading Model(STA and MTA)


STA(single threaded apartments)。apartment只是一个逻辑上的概念,它可以包含一个或多个线程。一个AppDomain可以包括一个或多个apartment。STA是指该apartment中只能包含一个thread。
MTA(multi threaded apartments)。指该apartment中可以包含多个thread。
STA and MTA 之间最大的区别就是MTA 可以在同一个apartment 中使用所有的共享资源并发执行多个线程。 而多个STA虽然可以共享数据,但是不能并发执行线程,存在性能问题。



@多執行緒開啟報表表單
會發生 引動過程目標例外狀況

因為 CrystalDecisions.CrystalReports.Engine.ReportDocument 可能再引用外部程式的時候
會動到某塊記憶體吧

當載入資料以後其他執行緒也跟著補上
又透過同個com元件對該記憶體做事情
而產生例外
@目前透過 將 ReportDocument 宣告為全域變數
以 SyncLock 該報表文件變數

   '載入報表資源動作

   End SyncLock

讓每個 Thread 依序執行載入報表動作


========================================
可能變成要走兩個完全不同的SQL
A.讓form上面呈現資料 (相關表單,變數為全域變數)
B.部呈現資料,做multi-thread轉檔 (相關表單為區域變數)


=======================================
目前測試可以執行多執行緒轉檔
但是有點邏輯上的錯誤
應該是變數切的不夠好
造成說同時轉檔寫入檔案會寫到相同內容資料

看是txt部分,還是轉excel部分


@發現說 DataGridView宣告為區域變數,
並且指定 DataSource,
是沒有意義的
不會產生任何資料鏈結

除非DataGridView 綁定在 form 表單之上

也就是說 DataGridView 可能無法當作multi-thread 的容器
不然就是要再想其他方式
直接傳 Table 之類的

目前透過傳 Table 資料轉 Excel

'有寫入相同檔名資料問題發生
要家判斷如果亂數檔已存在
重新亂數
======================================

如何在 Visual Basic.NET 或 Visual Basic 2005 中建立的執行緒



Thread.Start 方法 (Object)







How to pass multiple parameters in thread in VB




可以用~再來就看怎麼切

變數宣告藥用區域變數

最後結果再丟到痊癒變數


可能連轉檔得時候,用的datagridview都要變成區域宣告的

目前跑的都是讓他直接跑form上面宣告的DGV

挖靠超麻煩
這樣DGV顯示的數值也要弄進來



======================================
目前測試 partPrice可以跑
只要注意遺下
需要兩個背景執行
一個跑動畫
一個跑後端資料庫(主要工作)
主執行緒專注在其他東西 (這邊怪怪的,要再研究)

沒辦法把主要工作直接放在 主執行緒
會變成說圖沒辦法跑
======================================
The Parallel Programming Of .NET Framework 4.0(1) - Beginning

2011年9月22日 星期四

#VB Net讀取Execl問題回顧 2


嘗試安裝 Excel 2000 在引用該物件庫


目前可以共存
但是打開檔案以後




编码保存Excel2003与Excel 2000 Excel XP的不同


=================================================================

讀取 Excel 你還在用 NPOI 嗎?快來試試 LinqToExcel

http://demo.tc/Post/639




=================================================================

在 Server 端存取 Excel 檔案的利器:NPOI Library v1.21(改寫成VB範例)



筆記-Excel轉DataTable的NPOI簡單範例
http://blog.darkthread.net/post-2011-05-14-npoi-convert-xls-to-datatable.aspx

最近專案裡,我都開始改用NPOI來處理Excel檔案的讀寫輸出,感覺上比Excel DOM、OLE DB for JET、甚至CSV法來得穩定輕巧,而NPOI功能的齊全程度更是讓我驚喜連連。


這個需要再安裝NPOI的東西,暫時先沒碰


由於Excel 2000只支援"Microsoft Excel 9.0 Object Library"(Microsoft Excel 9 物件程式庫)


======================================

安裝2003之後安裝2000
好像變成說他VBIDE型別程式庫會改掉,變成2000的
然後在原本專案就會發生找不到 VBIDE的情況

移除一些系統找不到的com元件就好

好像還是出在安裝問題上
目前還是先移除掉 office 2000好了

反正也還沒找到格式解決辦法
===============================
快被Excel 2000 搞死
格式在 2003可以跑
到了2000就不能

對其方式
顯示欄位格式
都有問題


猜測是存檔格式問題


可以改用舊版的 格式來存 (格式還是會跑掉)
excel 2000 用的是 excel 9.0 的物件庫
看有沒有辦法弄到 9.0 物件庫來飲用
應該就可以解決



xlExcel5      - 1995
xlExcel6     - 1995/97
xlExcel7     - 1997
xlExcel8     - 1998
xlExcel9    -  2000
xlExcel10   - 2002
xlExcel11   -  2003
xlExcel12   -   2007
xlExcel13  -    2010
 xlWorkbookDefault

==============================================
在寫入巨集,一些格式設定,先後會引響結果
像是欄位格式應該先設定,最後才做merge

========================================


@需要注意

透過宣告
            Dim oExcel As Object = CreateObject("Excel.Application")



與使用
 dim oExcel as new application 的不同


兩者在 Excel 2000
使用API上面會有不一樣

2011年9月19日 星期一

@ CASE < 採購單尚未驗收項目提醒 > ver.20110919



'需要轉EXCEL

'採購單號,驗收物料,品茗,數量(packqty * acptqty),廠商 (supplierID)

==================================================

'發現說自訂控制項dll
宣告物件以後
基本上他事件依然是跟著 class
而不是跟著物件
變成同一個class定義兩個物件
沒辦法依照物件寫事件

應該可以
只是目前不知道
要再查查看

透過加入辨別控制向名稱解決




'加入廠商ID,日期區間
原本日期 改單一日期

'加入預期收貨日期

'萬用輸入


'需要一隻可以查詢 採購單上 已經開立驗收單(作廢不計)
尚未實際驗收的資料

採購單收貨日已到(consdate),尚未實際驗收開單的資料

'加入單一日期篩選

採購單(確認,核可,最新)找收貨日小於今天的,細項找尚未結案的 (isclosed = 0)
驗收單(最新,確認,0 or 2)
@找採購單不會出現在驗收單上的

所以需要結合兩個單子
透過 right join
找到 不存在 chkacptdet 上面 的 pono



[MySQL]left, right, inner, outer join 使用方法


http://blog.wu-boy.com/2009/01/mysqlleft-right-inner-outer-join-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/



select a.chkacptno, b.* from tblchkacptdet a right join tblpodet b
on a.pono = b.pono  and a.batchno = b.batchno and a.partcode = b.partcode
where a.chkacptno is null and consdate <= 20110920


============================================



select ac.chkacptno, po.pono as 採購單號, po.partcode as 物料編號, po.qty as 採購數, po.packqty as 單位量, po.採購總量 ,po.supplierID as 供應商ID
from
(select a.chkacptno, b.pono, b.partcode, b.batchno, max(a.formversion) as formversion
from tblchkacpt a join tblchkacptdet b on a.chkacptno = b.chkacptno
where not a.apvddate is null and ( a.status = 2 or a.status = 0 )
group by a.chkacptno, b.pono, b.partcode, b.batchno, b.packqty, b.acptqty) as ac
right join
(select c.pono, d.partcode, d.packqty, d.qty, d.packqty * d.qty as 採購總量, c.supplierID, d.batchno, max(c.formversion) as formversion
from tblpo c join tblpodet d on c.pono = d.pono
where c.status = 2 and (not c.apvddate is null)
and d.consdate <= 20110920
group by c.pono, c.supplierid, d.partcode, d.batchno, d.packqty, d.qty) as po
on
(ac.pono = po.pono and ac.batchno = po.batchno and ac.partcode = po.partcode)
where ac.chkacptno is null



===========================================
[tblchkacptdet ]  partcode batchno pono [tblpodet]

[tblchkacpt] apvddate not is null and  status <> 9 , max(formversion)

[tblpo] apvddate not is null and  status = 2 , max(formversion)

2011年9月18日 星期日

@CASE 5 < update 程式 > ver.20110919


====================================
'忘記建立更新暫存資料夾
包裝要去看一夏


'目前會更新整個資料夾
拿掉一些不必要的檔案更新

'關閉邏輯還是怪怪的
要再改

'可能需要在系統建一個介面上傳更新檔案
建一個資料庫紀錄版更資訊時間
(或是一樣寫入txt)

目前差不多可以

@RichTextBox 要怎麼依照輸入格式寫入stream
讀寫 透過 BIG5
========================================
要測看看,是不是辦公室的舊更新程式沒辦法自我更新
會不會影響到主程式更新
需不需要手動更新 更新程式
======================================
阿靠
用wm_copydata只能用sendmessage,postmessage不行
好像不能用在 postmessage
http://topic.csdn.net/t/20040125/16/2681042.html

先用檔案寫入的方式好了

不嚴謹~要在找時間研究看看怎麼透過監控記憶體的方式


===========================================
'需要將主程式寫入偵測更新程式版本
來做更新程式的更新動作


應該需要一個參數來判斷主程式應該去做更新 更新程式 的動作

應用程式間之參數傳遞(編號:28427)


1. 二個在不同電腦:使用 .NET Remoting、Socket、SendMessage 或實作 Winsock Client/Server 機制來傳輸資料
2. 二個在同一電腦:實作 Mutex, Semaphore, Memory Buffer 機制來交換資料,這是 Process Synchronized 的議題






目前做法是利用剪貼簿



[C#][VB.NET] VB.NET 的程式透過 SendMessage 傳送資訊到 C# 的程式


目前卡在 要COPY檔案的時候

更新程式尚未關閉


猜測是因為 SendMessage 會將控制權轉移
原本的程式則會進入 sleep 模式
等到確定 接收端 走完 Wndproc
才會 remain




嘗試從接收端關閉 更新程式





PostMessage和SendMessage的區別

SendMessage因為控制權轉移的關係
一定要等到回傳結果
才能關閉傳送訊息的程式

方法一 
嘗試改PostMessage

(要在側看看)
倒了~寫法應該是一樣的,卻覺得PostMessage 沒收到訊息





方法二
改更新動作在 Wndproc 走完以後
去偵測某個東西的變化
然後決定是不是要更新程式


攔截所觸發的 hWnd / Window Message 偵錯
http://social.msdn.microsoft.com/forums/zh-TW/232/thread/b1226fcd-638e-49c1-a701-4353e4fb288b




方法三
嘗試 memory Buffer






'需要加入更新自訂控制項 .DLL資料
置放在 Bin 資料夾之下

dll. 在安裝部屬的時候
好像設定一定要在 系統路徑底下

目前先直接寫入檔案

要查一夏怎麼部屬 自訂控鍵
讓他執行的時候能夠找到 dll資源

目前更新的dll資源放Bin
寫回Client, 將其複製到 執行資料夾


'應該改掉取消更新時
將主程式關閉
更新程式關閉

而不要等待再問

'在win7上安裝測試以後
大致上主程式可以執行

但是更新程式會出問題
不斷呼叫主程式
並且關閉更新程式

第一次測試
要再查查看

2011年9月17日 星期六

#VB ToolTips 設定

希望找尋方便簡單
能夠簡單使form上所有控鍵快速設定 提示 的方法

並且玩玩看 ToolTips 效果

2011年9月16日 星期五

#VB 控件描繪 相關


[Winform] 具有圖形選項的 ListBox


转 winform界面设计
http://spirit---moon.blog.163.com/blog/static/213231462010014114851785/

===========================================
找一下繪製漸層效果的 Form 背景
也順便讓 進度棒 有 漸層效果

2011年9月14日 星期三

#VB 在 gridview row 行頭上,添加訊息 & GridView 變色 閃爍

'再來就是看能不能讓改變顏色去在另一個 thread 上面跑
發現說移動的時候,下方的時間會停頓

再看看

========================================


dataGridView 闪烁 和 listview 闪烁 的解决办法。


可以透過建構子寫入 setstyle
但這個要自訂gridview 才可以做到

看有沒有辦法直接將預設gridview寫入 setstyle
沒辦法,他是 protected 
一定要透過繼承去 override

大翻修...


可能會需要多寫幾個不一樣的gridview class
來繼承
大致上應該把外面的gridview事件拉進去改成 自訂就好


需要注意的是
因為有分頁
當跳下一頁
如果該分頁資料筆數 比 前分頁所記錄的 RowindexSave 還要小
在判斷部分將會出錯

目前作法是在每次換分頁,將該變數初始化,不過也就要宣告成 public

在大致上注意遺下右鍵選單的東西

        'constructor
        Public Sub New()
            SetStyle(ControlStyles.DoubleBuffer Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True)
            UpdateStyles()
        End Sub


==========================================================
'希望透過重繪
做到 row 換色,不造成grid閃爍


將變色改寫入到 mouseMove
去偵測滑鼠位置
只改變當下 row 的顏色


http://topic.csdn.net/u/20070319/14/59dde966-1b66-4b26-8479-def76481c872.html

Private RowindexSave As Integer
  Private ColorSave As Color


  Private Sub dataGridView1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dataGridView1.MouseMove
  ht = dataGridView1.HitTest(e.X, e.Y)
  If (ht.Type = DataGridViewHitTestType.Cell) Then
  If (ht.RowIndex <> RowindexSave) Then
  dataGridView1.Rows(RowindexSave).DefaultCellStyle.BackColor = ColorSave
  ColorSave = dataGridView1.Rows(ht.RowIndex).DefaultCellStyle.BackColor
  dataGridView1.Rows(ht.RowIndex).DefaultCellStyle.BackColor = Color.FromArgb(255, 100, 192)
  RowindexSave = ht.RowIndex
  End If

  End If

  End Sub



=======================================================

DataGridView重绘行头(RowHeader)






http://social.msdn.microsoft.com/Forums/zh-CN/2212/thread/255b553d-01a3-4082-a3df-ae000ea1104e/


'做到每個 row 行頭 加上 行號 (第幾筆) 的功能
發現只會作用在畫面上的GridView


因為有分頁的關係

每次換頁面,就會重新計算行號

目前帶入分頁樹下去計算

#VB Excel HRESULT: 0x800A03EC 編輯狀態例外

在 excel 2000 上
當 DBF 寫入 txt 之後
用 excel opentext
要去掉參數 TrailingMinusNumbers
然後存成xls 文件時
要用 SaveAs
而不是 _SaveAs
========================================
碰道說將excel文件 open時候 如果選擇格式
發生 HRESULT: 0x800A03EC 例外
感覺跟下面有點不一樣


 a weird one- workbooks.opentext error
http://www.mrexcel.com/forum/showthread.php?t=54461


I think that argument of the OpenText method, is new in Excel 2002.

Delete TrailingMinusNumbers:=True and the comma before it. I can't imagine it makes any difference to the workings of the macro.



照上面說的拿掉該參數
可以走到 _SaveAs,也就是 OpenText 有被作用
但是SaveAs 卻說沒有這個方法可以用


測試拿掉 "_", 直接調用 SaveAs 就過了


但是跟之前知道說 在 excel2000 上面藥用 _saveas 方法不一樣
有點不清楚背後邏輯


先這樣吧

======================================

HRESULT: 0x800A03EC -----当EXCEL单元格处于编辑状态时



http://blog.csdn.net/luckisok/article/details/4638834




    当EXCEL单元格处于编辑状态时,往单元格赋值会出现 HRESULT: 0x800A03EC 错误,原因是编辑时,EXCEL很多功能被禁用。

#VB KeyPressEventHandler 委派


KeyPressEventHandler 委派


很屌

大致上先自訂一個 處理事件 sub(sender as obj, e as event)
然後透過控制項加入某個事件,將加入的事件委派由 自訂事件來處理

就可以了

要注意的是
當使用了委派
該事件將會一直跟著控制項
直到移除委派

AddHandler MyObject.Event1, AddressOf Me.MyEventHandler


RemoveHandler MyObject.Event1, AddressOf Me.MyEventHandler


ex
'自訂事件
        '處理 Cell 輸入 數字字元
        Private Sub ChkNumeric(ByVal sender As Object, ByVal e As KeyPressEventArgs)
            If e.KeyChar <> Convert.ToChar(8) Then

                '只讓數字過
                e.Handled = Not Char.IsDigit(e.KeyChar)

            Else '非內容輸入 時, 將 判斷為 鍵盤控制項按鈕(backspace)  ,輸入可作用
                e.Handled = Not Char.IsControl(e.KeyChar)
            End If
        End Sub

        '編輯儲存格時,將所有輸入轉大寫
        Private Sub myDataGridView_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles Me.EditingControlShowing
            If (TypeOf e.Control Is TextBox) Then
                DirectCast(e.Control, TextBox).CharacterCasing = CharacterCasing.Upper

                If Me.CurrentCell.ColumnIndex = Me.Columns("Type").Index Or _
                    Me.CurrentCell.ColumnIndex = Me.Columns("Sn").Index Or _
                    Me.CurrentCell.ColumnIndex = Me.Columns("Ordno").Index Then

                    '委派,將控制項加入 keyPress事件,該事件委派由 ChkNumeric 處理
                    AddHandler e.Control.KeyPress, AddressOf ChkNumeric
                End If
            End If
        End Sub

2011年9月13日 星期二

#VB OLEDB Create Table 建立 DBF 檔案


透過OLEDB 去建立 DBF 檔案

Dim strCn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\MCST\BACKUP\;Extended Properties=dBASE 5.0"

        Dim strQry As String = "CREATE TABLE " & fName & ".DBF ([part] Char(8), [type] Char(5), " & _
            "[desc] Char(40), [mac] Char(4), [class] Char(5), [sn] Numeric(6), " & _
            "[qq] Char(4), [mark] Char(10), [area] Char(10), [ordno] Char(8), " & _
            "[trndate] Char(8), [delidate] Char(8), [rem] Char(4), [lp] Char(1), " & _
            "[overtime] Char(1))"

2011年9月12日 星期一

@ALL CASE 2

'改寫到NetStripForm

'一些異常處理可能需要做到 協助解決問題的訊息

選配訂單,
目前針對 輸入訂單號條件
1.透過 單號
2.查無訂單資訊時
3.去找status <> 2 , consdate <> 輸入條件 (判斷走了哪條路做日期篩選)
4.與輸入條件做比對,顯示資訊


            '******************************
            '相似訂單訊息提示:
            '一.訂單單筆輸入
            '二.篩選無訂單
            '三.日期單一輸入 or 日期範圍輸入
            '四.相似訂單篩選 (細項尚未close之訂貨單號)
            '   1.status=2, consdate <> input 找不到 ->2
            '   2.status<>2, consdate = input 找不到 ->3
            '   3.status<>2, consdate <> input 找不到 ->不顯示相似資訊
            '******************************


目前分三種去走,每次只抓一筆資料,從最相似開始
透過交貨日期排序,找日期最新的


'動到 txt to xls (excel 回收資源問題)
需要檢查後續有沒有問題
(NetStripRepForm 需要修改合併 excel部分, excel元件回收問題)

'找時間試試看報表上加入copy篩選排序等功能

'一些SQL語法應該改 if else帶入SQL查詢
而不是在系統上面判斷 if else
應該能增進效能


'測看看 2003 xls 能不能再2010跑


'發現說判斷儲存的地方寫得不好
應該確認DGV是在沒有任何資料鏈結的模式之下
不做存檔動作

一些關黨動作
也應該適時的加入DataSource = nothing
而不是只清空table

'一些權限控制可能應該寫在menuForm之下
或是透過其他表單去設定
其他表單只是判斷是否有到哪個等級的權限
這要在規劃



'看能不能做一個滑鼠在 View 按下
能夠上下推動view的功能

要查遺下

'需要找個方式能夠隨著視窗大小變動
跟著修改內嵌form的大小以符合嵌入大小

'if else 太多,可讀性不佳


'要改更新資料夾道 Tools
所以要找時間把辦公室全部手動更新

'更新程式還是有點問題
會自我關閉跑回圈

'嘗試 CrystalReport 轉 Excel
可能需要自訂一個form
( 卡在子控制項 事件建立部分)
每個訂單資料都呼叫一個報表form
各自獨立各自去轉檔

透過new 原本的form就完成

卡在form就算用new 但是變數名稱媒改的話,
就永遠在呼叫同一個form

要想看看有沒有辦法切

感覺一定要自訂form
不然把DGV的資料抓下來
每次都是記錄最後一次
感覺起來並不是說是完整的切割
不知道是不是我宣告錯
照理來說new form 應該是每個form的變數是獨立的才對啊

感覺是DataGridView會跟著變動的關係
就像是table作為gridview的source
table一變動
gridview跟著變動


問題就出在這裡了

DataGridView Rows Copy

當一個DataRow屬於一個DataTable1的執行個體時,不可以直接把它指派給另一個DataTable執行個體,例如把它指派給另一個叫DataTable2的執行個體。


所以應該確定是分開的
只是複製的過程有問題
直接指定應該是屬於資料鍵結的方式
它並不是By Value而是By Reference


還是一樣
要再查查看




[C#][VB.NET]隱藏檔案、隱藏資料夾

需要將暫存檔案隱藏起來
或是說能不能找一個暫存的方式建立檔案
走完流程自動刪除



VB.NET

        ' 隱藏檔案
        Dim strFileName As String = "C:\test.txt"
        Dim fileInfo As New FileInfo(strFileName)
        fileInfo.Attributes = FileAttributes.Hidden

        '隱藏資料夾
        Dim strDirName As String = "C:\test"
        Dim diMyDir As New DirectoryInfo(strDirName)
        diMyDir.Attributes = FileAttributes.Hidden

*註 : 設定多個屬性,可使用以下方式
fileInfo.Attributes = FileAttributes.Hidden | FileAttributes.ReadOnly;




要查查看有沒有類似暫存檔案的東西


'需要再檢視一夏 列印 部分功能
在檢視一夏,自訂控制項設置

好險有看到
發現說之前寫好的轉檔
沒有改去用
MRPChoice, OrderMRP

所以兩個都要改用 MRP 的TXT 2 XLS
然後再format 裡面寫入格式 的變數要在改一下

再來就是改移下亂數名稱,存成使用者或是預設名稱

'辦公室安裝程式
(安裝過的重新安裝->寫好相互更新程式,以及寫入dll,才可以放)

'update win7 & Server
系統更新出問題

'更換 gridView

'需要注意所有會到其他曹的路徑
盡量改系統路徑

'找方法把現在界面美化

'考慮把分頁功能寫在右鍵選單內

'gridview 編輯的時候,
感覺重繪gridview有點怪怪的
gridview畫面會有點被背景蓋掉
要查遺下

'想做一些GridView Title的東西
用panel 裡面放一個 Label 一直做不好

要再查查看有沒有更好的做法

'或許批次轉檔
完成轉檔動作
應該只做一次提示

會要處理複寫問題
方案一
直接複寫

方案二
一樣做提示,讓他改檔名
如果沒有重複黨名,就不做轉檔提示

要再問問看


'PartPrice 應該不需要透過TXT在寫入EXCEL
因為本來就不是單純的格式
很多需要一個CELL一個CELL去塞入資料

不然就是要再想看看

'進度提示要整理遺下
除了進度棒,可能要再個動作提醒
告知什麼動作完成,失敗之類的


===============================================

'需要檢查遺下
只有一筆訂單
沒有選取
走轉檔列印有沒有問題


'發現說勾選訂單,重新篩選
沒有把勾選的訂單初始化
變成直接轉檔列印會弄到上次的

@所以要記得把轉檔列印用的Datagridview給清空


'需要去改所有建立檔案,中間的暫存檔案去改成亂數
實際儲存以後再改成要的

'建立一個流程 PPT

'發現OrderMRP 一些訂貨單查詢 會有些問題
Chioce 也是 都是訂貨單查詢出問題
一些特別單號上面
可能有跑道一些一般異常
要查查看

@@訂貨單上可能不是只有 PDT 也可以有其他東西
只存在 stock裡面

有很多情況
今天是因為修改料號的關係
還要考慮訂單上會有外購品,新料號,或是客人直接訂的原物料選配物料

所以只要走到停下來
沒有往後面撈到物料
就把該訂單上面的料號列出來

列為 一般異常
只撈 stock 品名
(或許還可以考慮結合 bomPdt,撈bom的停用狀態)




'需要改良遺下全選,不全選的效能
因為改成自訂DataGridView
之前迴圈給定,到了dataBinding下的 notSortable
會產生重複呼叫問題

目前作法是,刪掉 "選取" 欄位
重建一個新的 "選取" , DefaultValue 再去設預設值
也改善了效能



'分頁上面
如果使用者跳到後面的分頁
然後重新聯另外一個表單

分頁還是停在該數字
(察第三頁,重新連,還在第三頁)

應該做初始化動作


'檢查一夏建置Excel 目錄是否有檢查,並且建置

'關於選取 row 然後讀取後端資料表
其實可以分開來
當click事件,則選取box將勾選
doubleClick事件,才將後端資料表讀取出來

發現說如果要改,
鍵盤選取列
就不能寫在 SelectionChange事件裡

目前做法是
拿掉 SelectionChange
寫入 DoubleClick
希望再把勾選寫入 Click事件


'轉的時候,MRP的格式怪怪的
MRPChoice可以過,MRP卻不能過
兩個都是用gridview參數
有點弔詭

MRP格式怪怪的
先擋著
一樣是如果沒有saveas指令,
好像就視為 txt


'要開始自訂控制項了
不然很多東西想做卻沒辦法做


各種自訂控制項


#VB LINQ to SQL Insert/ Update/ Delete


需要透過LinQ去將資料做更新動作

==================================================

LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作


插入、更新和刪除作業 (LINQ to SQL)

#VB 得知DataGridView 有所異動

你的datatable裡面的每一個ROW都會有一個RowState的屬性
如果該ROW是新增則RowState="Added"
如果該ROW是有被修改過的RowState="Modifyed"
如果該ROW是被刪除的則RowState="Deleted"
如果該ROW都未被異動過的則RowState="UnChange"
然後自己下迴圈去跑Command
再異動DataTable資料的的時候要注意移除資料請用
Rows(i).Delete()

不要使用Rows.Remove(i)
前者為資料狀態改為刪除
後者則為真實將資料列刪除
另外你如果有呼叫使用AcceptChanges()的話則會將資料認可為未異動的狀態RowState="UnChange"







如何更得知DataGridView異動過的資料,進行資料庫更新?


http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060913141957WZ1&fumcde=&odr=cdt&odrtyp=0




DataRow.RowState 屬性


#VB DataGridView 不透過 AllowUserToAddRows, 去新增 Row



需要不透過allowAddRow的方式新增 row
但是不能直接在已經 dataBinding的 GridView 上面以add的方式新增 row


查了一夏似乎是要直接新增到 GridView 的資料來源


=============================================
一向datagridview中添加新行:

DataRow   newRow   =   dataset.tables[0].newRow;
newRow[0]   =   "adfadsf ";
........
........
dataset.tables[0].Rows.Add(newRow);
这些代码是将数据写到Access数据表里的吧,而不是写到datagridview中的.怎样才能先写到datagridview中显示,然后再确认是否将datagridview中数据保存到Access数据表中呢?
----------------------------------
dataset.tables[0].Rows.Add(newRow);
并没有向数据库写入数据。。
而是向存在内存中的DataSet(本地数据库)添加了一行数据。


当DataGridView绑定数据源(如DataSet)之后。
DataGridView   中的值改时,DataSet的值也会随之而变。
同样。当改变dataSet中的值时。用来显示数据的DataGridView也会做出相应调整。


楼主用:
object[]   row   =   new   object[]   {   ,   ,   ,   ...   };
datagridview.Rows.Add(row);
改变数据出错,不在于访问数据库的不同。
而是需要改变用来“保存数据”的dataSet,或是用户手动编辑dataGridView中单元格中的数据。 

#VB 自訂控制項


大致上,要把自訂的控制項基本內容實作設計好

目前是把一些會用到外部資源的事件,或是sub拿掉

等待加入工具,引用參考以後
再從事件中寫入觸發

再來就是要開始規劃一下自己的類別庫

也應該要把自己的class寫得夠嚴謹一些
property 宣告 private 屬性 get ,set
那些適合public,protected,private
要再多磨練多學習

沒想到寫一個自訂MaskTextBox
然後換一個小元件
就花了一整天
類~


VB.NET的Object Oriented编程内功心法。


======================================
應該將相似的控制項
寫在同一個dll之中
宣告成不同class

imports 一次
應該可以拉出不同控制向

可以

@但是要注意的是
當自訂classFather
以及自訂classSon inhirents classFather

Father 與Son含有相同事件
必須將Father 宣告成 Protected Overridable
將 Son 宣告成 Protected Overrides

Son的事件複寫掉Father
否則將會先走 Father 事件,接著走 Son 事件

不管你的事件是不是宣告成 private
=======================================
發現說,自訂控制向
如果有寫入事件
他會先走  form 後端寫入的
才走 dll 寫入的
========================================
因為需求
要查看看怎麼呼叫class中的sub或是function
讓class更方便使用

可以這樣用
但是要注意的是必須宣告成 public
====================================
自訂or擴充 控制項

ControlDesigner 類別

http://msdn.microsoft.com/zh-tw/library/system.windows.forms.design.controldesigner.aspx
(該範例將作用在Design階段,而不是執行階段
在拖拉控制項,設計介面的時候看的到效果)

在建置MSDN範例類別庫的時候 
沒辦法引用 System.Windows.Forms.Design.ControlDesigner

範例的許多.net類別庫需要先引用參考
system.windows.forms
system.Design

大致上該範例就能執行

基本上建置完類別庫
就會產生.dll檔案
到時候就可以引用到工具箱
並且引用參考資源到WinForm專案內
再來就用拖拉的

再來就是內容宣告
要研究怎麼寫





有關於VB.net 開發DLL的問題

建好,工具箱也加入
參考資源也引用

但是卻說元件未定義


不太確定是不是下面的原因

要把 .NET DLL 開放給 COM Client (VB6) 使用,必須要經過 regasm.exe 這個程序,可參考 tihs 大的說明。

純 DLL 是指使用 C 的 export 功能匯出函式符號表 (symbol table) 的 DLL,以 Windows 現有的 User32.DLL,Kernel32.DLL,GDI32.DLL 或是 Advapi32.DLL 這些,若硬體廠商有提供 DLL,也大多是這種類型。純 DLL 必須要由 C/C++ 來開發。

.NET DLL
 和 COM DLL (VB6 可產出的 DLL) 雖然都是用加入參考的方式,但底層大不同。COM DLL 是以 COM 平台為主,而且有實作 IDispose 介面的 DLL,擁有型別函式庫來識別,而 .NET DLL 是以組件的方式存在於 .NET Framework 平台上,COM 和 .NET 可以互通。


一直測不出來
可能是 framework 目標版本問題
但是他現在目標版本怎麼不見了
找不到要到哪邊設定


大概知道是因為目標 FrameWork的關係
元件是 4.0
而專案要引用該元件就必須在4.0的 FrameWork環境


HOW TO:以特定的 .NET Framework 版本或設定檔為目標


=======================================
繼承與事件
http://mogerwu.pixnet.net/blog/post/25997535-%E7%B9%BC%E6%89%BF%E8%88%87%E4%BA%8B%E4%BB%B6


測試過後,發現事件會被繼承
上面一個DoubleClick
在下面的GridView 也可以作用

看怎樣可以捨棄掉該事件

有點怪,private 事件
不知道為什麼也會被繼承到子class內


暫時先兩個分開宣告,各自繼承基底類別
=================================================
因為需要一個編輯模式不太一樣的GridView
(enter 送出編輯以後,自動跳下一個column,而不是預設的下一個 row)

目前透過自己寫的類別
去繼承 DataGridView
然後嵌入Panel 

@要注意的是
宣告的class
事件發生要寫在該宣告class之內

如class呼叫自己本身
要用 me
如果呼叫到class之外的變數
要明確指出是哪個物件的哪個變數或控制項


=============================================================

開發您的第一個 Custom Control - 使用 Visual Studio 2005
http://j2se.myweb.hinet.net/article/dotnet/011/011.htm



[VB6][VBA][VB.net][自製控制項] 再談 Timer 控制項 - 時間解析度過低的解決方法(三)自製「使用者控制項」


2011年9月8日 星期四

@CASE 7 < 製令製造書 > ver-110908

'目前將日期輸入部分
限制數字輸入
限制輸入長度6

當長度夠,會加入"."做分隔,長度變8
報表判斷長度是否為8
不是,則印出原始數值
是,才做split顯示日期格式

可能修改時候,Cell取得焦點
應該將格式改回全數字
要再修
==========================================================
'需要檢查年月長度
不允許太多太少
月份應該限制在01~12之間

輸入前就擋下來


'提示使用者輸入料號是否存在
目前只做提示

 Me.Rows(e.RowIndex).Cells("Mark").ErrorText = "此客戶名稱不存在"

希望能夠做到載入dbf以後
就能馬上得知那些資料是應該出現 ErrorText的
目前都要先透過 cellEndEdit才能出來

'地區,
tblsysarea
tblcust.area

mark = tblcust.custid
Area = tblcust.area - > tblsysarea.areacode

DBF上面有一些是公司名稱
目前做法先帶地區
讓使用著自行輸入地區去改成客戶公司名
======================================
'希望限制 numeric 型別欄位
只能輸入數字

[C#]DataGridView欄位驗證只能是數字且不能為空白



'可能需要把所有輸入字母轉大寫
目前寫在 myDataGridView_EditingControlShowing 事件之中
將會發生在編輯儲存格的時候

檢查所有textbox cell,將輸入 ToUpper

透過委派事件+editingControlShowing,將 限制輸入寫入
並且作調轉大小寫

'發現說有些欄位如果空值(有些允許,有些不允許)
可以寫入DBF
但是讀取
將會在  evensQuery.Any 之下
產生
物件必須屬於 String 型別。

一些char 型別的欄位
用LINQ讀取以後
如果是null
好像會判斷成null
不太清楚判斷上怎麼判斷

[LINQ] 沒有適當的方法'Contains'存在於型別'String'中
有點像我的問題


但一但這樣更改,就會出現「沒有適當的方法'Contains'存在於型別'String'中」的Error。
2010-10-04_025051

查了許久的資料,終於發現問題是出在,ControlParameter的其中一個屬性
ConvertEmptyStringToNull 預設是true,所以在未輸入參數的情況下,
@query被轉成Null值了,當然就不會有Contains的方法。

解決的方式只要設定ConvertEmptyStringToNull=false 即可,非常簡單,不過,有種想砸電腦的fu~ 



應該是那個欄位沒有值也就是NUll

所以在傳換之前要先撿查是否為DBNull

ex:

if Not IsDbNull(ds.Tables(0).Rows(61).Item(1)) Then

    str1 = ds.Tables(0).Rows(61).Item(1)

Else

   str1=""

End if

透過一開始將新增的row
如果欄位型別為 string 的
寫入預設 string ""
這樣寫入就不會是DBNull


'發現說如果新增資料列
都沒有輸入資料
儲存檔案
將會再檢查row 的時候發生索引錯誤

感覺是因為我的檢查函式是寫在CellEnter之下
所以如果新增row 沒離開該row 去檢查
直接儲存
會發生錯誤

看能不能再儲存的時候也去做檢查

shit 動一個地方一堆錯誤跑出來

目前將 檢查 row 寫在 cellLeave
cellenter 只有寫入 beginEdit

變成新增資料row
在寫入 DGV.currentCell 時 發生
作業失敗,因為程式無法認可或結束儲存格值的變更。

@改回 CellEnter 寫入檢查
但是儲存檔案會再做一次檢查 row

======================================
'寫入上傳功能

'年月查詢
做mask格式限制

'應該修改檔案存檔,新增
在 該查詢檔案存在時
可以作用

'每次查詢,若檔案存在server,client
詢問是否覆蓋

若server沒有 ,將不做事(或是紀錄是否server存在,或是基本上先不做)


'建置新檔案,
方案一
是否要放在查詢按鈕之下,
當檔案不存在,詢問是否建置新檔案
然後開放新增 Row

目前透過查詢後詢問
建立以後立即連線該DBF

方案二
透過另外一個 Button來建立新檔案

'地區有一些設定上ERP上面沒有
區域不全
沒有班別

'物料,地區 可能要改從ERP上面撈
目前作法是
一開始讀取所有 XF 的資料,
輸入舊料號的時候再做 dataTable的 Filter

@物料

找半成品XF,撈出新料號,品名
select partcode, partrule as hpartcode from tblstock where partrule like '%@[0121@]' escape '@'
and partcode like '%XF'
group by partrule, partcode



=========================================================
'連續按新增,會跳過檢查(所以會一直新增空白行)
可能要讓他新增,同時也去檢查上次新增的位置是否空白

所以可能要記錄到兩次的 LastIndex

或著說就不管,
反正到時候送出資料,要在檢查一次所有資料
(效能問題,希望做到說送出時候可以不用再檢查資料)

'目前關掉 allowaddrow
透過新增tbl row
來新增空白資料行

所以需要寫入檢查 function


'看有沒有什麼辦法可以讓新增row,將編輯區域限制在 新增的資料
(只可以左右)
離開檢查該筆資料是否所有欄位為空值
空值視同刪除

在檢查 txt 抓資料數值的時候,去檢查
是不是該 row 所有的欄位資料都是空值
空如果是,則刪除該筆資料的串接字串

'必要項目
Part, Desc, Trndate, Delidate
也就是可能只需要檢查
這些欄位
其他可以接受空值

發現說當我關閉新增模式以後
它會自動檢驗所有欄位是不是沒有輸入數值
如果沒有會自動清掉該 row

變成可能只要自己寫判斷有沒有 空白字串 產生

===============================================================
'需要一個可以遮擋底下控制項的區塊
像是 form.showDialog

目前是將其他背景控制項 enabled 關掉

'開始寫
自動帶入其他相關資料 功能
(將在新增~編輯模式 之下 )

目前寫在KeyDown,但是好像不能
需要再配合 endEdit 每次 end 就跳下一列才對
而不是單純gridview上面的滑動



How catch Enter Key on EndEdit of Datagridview



看起來似乎是說,在edit 模式之下,enter是 將是在 ProcessDialogKey()
之下執行,所以必須複寫 這個function ,寫上自己要的邏輯
要測測看

有點棘手,他是自己寫一個datagridview class 來使用
不熟
先擺著
=============================================================

每次開啟製程表單
就讀取 地區 , 料號 兩隻 DBF
(有沒有什麼方式可以不需要讀取,以快取方式)

檢查資料夾有沒有兩個DBF
不存在就下載
或是詢問是否下載
(一開始多次問,或是一次全部覆蓋)


'需要一個 編輯地區 與 編輯料號 的表單


'可能需要一開始選取整個row
然後可以判斷是否選取,然後改變GridView的選取欄位

變成編輯模式(新增,修改)
改選取模式Cell
在編輯模式選取row, 將不改變 GridView的選取欄位

'希望能夠添加 Row 的編號 計數器



'是否PC跟SERVER資料要分存
操作上,需透過詢問才上船SERVER
也詢問是否需要下載



================================================

'馬的
本來的DBF資料庫 每個檔案的資料型態 基本上是一樣的
但是numeric 的預設值 0有的有設,有的沒設
變成說如果該欄位是空值
有設預設DecimalIndex 0 的就會報錯

這個看能不能複製資料形態到所有MCST檔案
存起來
要再跟老大討論

目前先把 numeric 型態的資料,遇到空值得帶入 0,做搬移資料寫入動作