2011年10月2日 星期日

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


'缺一個查詢介面,
透過檔案名稱,資料索引,
篩選異動歷史紀錄

看能不能做一個停留某筆資料一定時間,自動跳出一個小型表單選項
作為直接查詢該筆資料所有歷史異動

'選取最後幾筆資料會亂跳焦點
要再檢查一夏

@如果不是透過編輯狀態BegingEdit,
而是透過程式給定Cell數值時,
將會引發DataBindingComplite事件

會變成說畫面重繪,
所以每次在新增資料最後一筆的時候,GridView範圍會重新繪製
填滿原本空缺處,
選取焦點就會跑掉


在CellEndEdit 之下出問題


DataGridView上直接編輯之幾個好用的指令



目前只要一對相依Cell做給值動作就會
照成焦點的改變,畫面的跳動,

看能不能至轉換焦點,驗證相依Cell之後再回到預設下一個Cell焦點開啟編輯

@或是說限制GridView ScrollBar無法拉到產生空白處

'需要對資料做異動紀錄,紀錄時間點,異動人,異動資訊

@目前記錄的資料,如果原始內容消失,將看不出資料的原始狀態
先這樣在說好了

    '*****************
    'A.為目前MCST檔案新增一個Primary欄位做為資料索引
    'B.或是乾脆將所有資料寫入SQL
    '
    '
    '針對資料 新增、刪除、修改 做時間點,修改人,修改哪一筆資料的紀錄
    '需要建立一個紀錄異動訊息的Table
    'USER_TASKMAKE_DATACHANGE
    '1.異動資料檔案名稱 (MCSTNAME)
    '2.資料索引位置 (DATAINDEX)
    '3.新增,刪除,或修改的動作紀錄 (CHANGE)
    '4.修改人 (USERID,USERNAME)
    '5.更動時間 (DATETIME)
    '
    '需要注意跨檔案轉移資料要怎麼紀錄
    '*****************



之後做一個查詢介面,
1.輸入查詢檔案
2.查詢資料索引
去找出該筆資料所有歷史異動資訊

@怎麼在既有舊資料新增欄位後 給定索引值
 可能需要寫一個副程式先跑一次

@何時才應該記錄新增,刪除,修改資料的時機

    '有輸入焦點
    '新增:1.空白               (新增時,目前全部新增都會記錄異動)
    '     2.部分欄位有資料  
    '       或完整資料
    '修改:離開row就判斷是否被修改 (編輯離開時,紀錄修改異動欄位)

    '無輸入焦點
    '刪除:點選確定刪除後,把該選取資料做紀錄 (選取刪除時)
    '資料搬移:判斷是dgv1移出移入還是dgv2移出移入  (DragDrop後)
    '         需要處理移入索引問題 (移入索引需要改寫,從被移入最大索引開始累加)
    '***************************
    '你的datatable裡面的每一個ROW都會有一個RowState的屬性
    '如果該ROW是新增則RowState="Added"
    '如果該ROW是有被修改過的RowState="Modifyed"
    '如果該ROW是被刪除的則RowState="Deleted"
    '如果該ROW都未被異動過的則RowState="UnChange"
    '***************************


@每次一新增,就將索引值往上加,如果欄位全空白(除了索引欄位),
    就篩除該欄位資料,並且移除暫存Table相關索引資料

@每次取得輸入焦點,就會判斷該row modifyer
  可能何時紀錄異動資訊要再想看看,
  目前每次離開Row都會記錄一次,變成重複紀錄row狀態


得知 DataGridView 有所異動



如何判断DataGridView 行状态



@需要想遺下異常結束,需不需要紀錄異動結果
   到底應該何時去紀錄相關異動資訊
 
   如果所有操作,最後又沒存檔,是不是應該就捨棄之前所有暫時性紀錄
   直到確認所有操作送出上傳後,將之前所有暫存的異動資料記錄
   最後全部上傳

@存取檔案要注意另外處理索引欄位



'透過加入不同委派事件
在不同Cell做輸入字元控制

卡在怎麼判斷之前所委派的事件是哪個
必須先移除該委派,才能加入欄位所屬的委派輸入事件
才不會交互影響

目前加入Cell委派事件之前,
先一次刪除所有之前的委派


'反映說有時候存檔後,查詢卻是存檔前狀態
發生再更改訂單日期的時候
(測試登入,實際登入)
目前觀察應該是不會有問題發生
在觀察

'限制輸入日期長度
 限定數字輸入

抓列印日期部分防呆




'忘記拿掉測試路徑出包
目前加入判斷路徑防呆
非管理員無法以測試路徑上傳主機


'可能需要類似複製貼上的功能


切得不好
感覺現在寫法不是和這樣做
看能不能開一個View
然後只接受轉入資料(或也可以轉出)
無法直接編輯(在某一方面也算是可編輯啦)

'限制單一使用者編輯動作
必須透過一個不會使用的檔案,
不然會造成下載複製檔案的意外(檔案被,open,無法透過)

'對資料做標示,改變顏色 (方便回頭修改找資料)

目前排序等任何對GridView做重繪的動作將會消失

@發現說,在跨黨案時,做標記動作,沒反應,
並且左鍵拖拉會啟動

有點寫太亂~
目前測試已修正點右鍵後,左鍵能夠拖拉的問題
跨黨案開啟,將不做標記



'可能需要panel開啟後,關閉其他panel
不然怕有相互影響

'可能需要一段時間內,自動存檔功能


'可能需要考慮到transaction的部分
新刪修可執行以後才commit

'畫面滑動,有時候紀錄變色位置會出錯


'有機會改改托放作業的顯示方式
希望做到panel淡色描繪的玻璃樣式

'存檔太慢,要改

.NET中DragDrop的光标



Control.GiveFeedback 事件



目前可以描繪控制向外框
但是侷限在controls
要找辦法描繪 GridViewRow
然後描繪整個row,而不只是外框



'刪除可能需要提示刪除幾筆資料
以免刪除了預期外的資料

'當檔案清空以後做存檔動作,將會產生一筆空白資料列
應該不會有什麼影響吧

在修


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


'跨黨案轉移資料會出問題
(-1沒有資料列)


'需要新增列印機台篩選


'存檔後,還是有機會發生
索引不正確,GView紅線的問題

@問題可能出在 新增 row的時候
如果有空白 row ,之後有接續 非空白 row
會因為空白row被篩選掉
造成之前紀錄的索引值有所出入

只要一透過篩選動作,索引就會有出入

@新增 row 以後,如果不離開焦點,直接點選儲存
會先走儲存動作,才做 row_leave

@ rows.remove 以後, 也會引發 row leave

目前拿掉 row leave 檢查空白 row動作
透過每次存檔 剔除空白資料
存檔後,將編輯狀態拿掉


'一次選取多筆資料打勾 (做刪除)


'托放重繪可能有索引上的問題,
發生索引超過預期值
並且GirdView 出現 紅線 方框 + 紅線 X, 資料畫面消失

托放,結束托放,新增,儲存

感覺問題是出在一些GridView重新繪製Row的時候,
判斷的索引出了問題

照理說再只開單依檔案的情況下
不應該出現紅色線條在GirdView上

所以對索引做了些初始化修改,
要在測試看看

感覺有時間要把這個GridView的Code整理遺下
要更精準地去寫好每個功能
不然太亂了

感覺跟存檔以後屬性為初始化有關係,
dgv應該做一些屬性初始化動作
再重新鏈結 Table

每次關閉跨黨案的時候,
將兩個dgv 做屬性初始




'可能需要在編輯某個檔案時,將伺服器上的檔案鎖住
讓新的使用者不能編輯
(但是這樣好像沒意義,通常編輯都會在相同檔案之上)

建立一個檔案,檔案持續Open狀態(鎖定)

可否Open,
不能:有其他人在編修
可以:則開啟Open,鎖定檔案,



'需要增加 ORDNO , MAC, PART 篩選

目前透過DataTable.Select
萬用字元搜尋有限制
只接受 *,在字串的前端或末端

機台改抓ERP 生產單位檔
直接透過鏈結選取

[ Resources ]
目前只抓 F- , 1- ,2-

透過ListBox讓使用者選取
或許part,ordno也可以載入DBF清單,做篩選
可以手 key,像是萬用字元搜尋,也可以選取
選完一樣回到textbox自動 "," 分隔

@ListBox 設定好 DataSource 以後,
移除資料需要透過 資料來源
像是GridView 的情況
無法直接透過List.items.remove

'排序透過機台排序,加上次要日期排序

'拿掉TYPE,QQ,LP,做不顯示處理

'反映說,開立新檔案,
全部手Key資料
存檔 (50筆資料)
卻顯示說資料 超過範圍
最後只寫入 11 筆資料

@品茗欄位長度 在 DBF 是 40
所以要限制所有欄位長度輸入

應該將限制寫在要建立檔案時

目前所有欄位每次改DataSource就限制該欄位字串長度
寫入時,在檢查只取適當長度寫入



'權限控管
1.鎖掉編輯

@目前下載會覆蓋編輯過Client檔案
到時候編輯玩直接存回server後
就不會有這方面問題



'每次編輯結束,存檔將直接上傳伺服器


'加入列印報表功能
以製造日期作為製表日期,月份
以機台區分製令書列印

直接選擇列印日期
(應該要可以跨月份,目前先不做,轉ERP再來)
自動抓日期,
按照月份,機台去分列印內容

1.透過原本的篩選範圍來列印
(打開才能印)
2.另外選取輸入列印範圍
(沒開也能印)

變成 table 資料要在選取列印的時候撈取

@思考遺下沒輸入日期(有年月)
列印時要抓最大最小日期作為列印範圍
或是限制要輸入日期範圍

目前先做一定要輸入範圍才能列印

@列印檔案如果是編輯檔案,是不是應該先做存檔,才列印
還是直接列印編輯後狀態,但是沒做存檔動作

目前作法是
如果是正在編輯檔案,
1.先存檔, SaveAllView
2.在列印(走SQL撈資料列印)
如果不是,走SQL撈資料列印



'日期篩選不完全
何時出現篩選按鈕


'以IO方式複製 McstDataSchema 檔案
重新命名以此建立新檔案

McstDataSchema 放在server端
每次建立檔案檢查是否存在
不存在則詢問下載



'需要檢查如果編輯檔案沒開啟
不顯示瀏覽檔案開啟功能


'進度提示


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

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

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



DataGridView 列自定义排序
http://topic.csdn.net/u/20070525/09/cb563777-ad04-48b0-a2b1-b4b07ebd9039.html

'可能需要複寫自動排序邏輯(MAC欄位)
1. "-" 之前
2. "-" 之後

1.先比長度
2.在比字串


[.NET][Winform] 利用集合排序,重現 DataGridView 資料繫結後的排序





Sort DataGridView cells in programmatic way



@當GridView被鍵結到 DataTable 以後
無法透過 GridView.Sort 去自訂排序


要從 DataTable 著手

Linq: Sorting a DataTable


http://msmvps.com/blogs/deborahk/archive/2009/07/23/linq-sorting-a-datatable.aspx

可以比較,但是目前好像沒辦法做兩次比較
看了一些也只是簡單的升降密排序

目前作法是分 "-",前後兩個字串
是否能轉數字,不能就下沉

前後段數字比較

需要先透過view去排序 Table
最後再把View 轉回 Table 指定給 原始Table

需要透過某種方式去判斷自訂排序的升降密
原本的可以透過 DGV.SortOrder 去取得目前的排序方式
自訂就不行
當您使用自訂排序為控制項排序時,這個屬性的值並沒有什麼意義。
透過自訂一個狀態變數來記憶目前自訂排序的方式

無法轉換數字做比較的,
以原始字串比較方式排序



'發現說mouse down 不會即時反應在點選列上
變成拖拉到其他欄位

因為要寫在mouse down 下,DoDragDrop
如果拿掉就變成托放無法多選
每次一點選就跑掉select

或許可以考慮托放改成  滑鼠右鍵



'看能不能做到多選拖拉轉移檔案功能

DataGridView MultiSelect drag problem




透過 Me.DoDragDrop(Me.SelectedRows 要抓的資料, DragDropEffects.All) 寫在 mouse Down
Drop 時候,透過 


   Dim test As DataGridViewSelectedRowCollection = e.Data.GetData(GetType(DataGridViewSelectedRowCollection))
將該資料取出 Loop寫入放置位置


然後注意遺下該 資料 在 table的原始位置就可以了

所以可能可以拿掉 單一的方式,
也可能不需要記憶太多Index


再來是看一夏多選托放
在空白檔案之下,放入會出問題
好像問題是出在說,搬移以後
GridView 跟 table 好像索引不會重新關聯
這要再查看看

感覺問題出在說,DGV與 Table 之間的鍵結關係上
需要重新鍵結


在每次托放作業結束以後
將dgv1,dgv2重新與 DataSource鏈結一次
來更新 dgv 與 table 之間索引值得關係 ( DataBoundItem )




'需要做離開直接存檔
拿掉存檔功能
寫在離開以及關閉瀏覽檔案下


'使用者自訂排序功能
(機台,日期...等等,或是全開)

會影響拖拉資料

會影響新增資料之後馬上自動排序

看能不能找個辦法不自動排序
直到手動




DataGridView排序狀態移除問題


只有當未設定 DataSource 屬性時,這個方法才有效。當您將 DataGridView 控制項繫結至外部資料來源時,您必須使用該資料來源所提供的排序作業。當您藉由實作虛擬模式來提供您自己的資料來源時,也必須自行處理排序作業。


不要透過DataGridView來取消排序。要用 DataSource 來取消,因為有Binding到DataSet。

不想排序時,把 DataTable.DefaultView.Sort 清空即可,即:
 DataTable.DefaultView.Sort = string.Empty;







'需要加入日期篩選功能
(先侷限在開啟檔案之內
年月固定(檔案名稱), 日可以再次篩選)

所以存取要改寫
單一,範圍,空白(全抓)

1.一樣全抓
2.show篩選範圍 table
3.非篩選範圍 table, 暫存
4.編輯完畢儲存, 結合 暫存 table
5. drop create


重複篩選
1.將show的與暫存 table結合 (可能需要做一次存檔)
2.在一次篩選

篩選畫面下存檔

1.每次存檔先結合 show, tmp
2.透過 主要 table 去做存檔動作



感覺現在寫法效能會有問題
跑看看在看怎麼改


@發現說如果開放排序功能
托放作業將會受到影響
(view的排序與實際 table 排序不同)

DataGridView排序後,如何抓取綁定資料的正確索引值
http://www.baddog.idv.tw/notebook.php?mo=notebook&fn=view&id=5

DataRowView drv = dataGridView.SelectedRows[0].DataBoundItem as DataRowView;
int index = dataTable.Rows.IndexOf(drv.Row);

所以必須要在mouse down 的時候,抓drv 與 tableRow之間的關係
找到真正的 index



'日期下拉是選單
年分提供前後兩年內的下拉是內容



Form2   form   =   new   Form2();
                        form.FormBorderStyle   =   FormBorderStyle.None;
                        form.TopLevel   =   false;
                        splitContainer1.Panel2.Controls.Add(form);   
                        form.Show();




'型別問題
可能問題出在gridview上面的型別問題

DataSourceChange時,將所有欄位資料直行別設為string



'發現說檔案只有一個資料的時候存檔
會發生 Class Range 的 autoFill 方法失敗 的問題

猜測是因為autofill 無法作用在單一cell的 range上 range("B2:B2")
所以可能要走


       oExcel.Sheets(1).Application.Selection.Copy()
                oExcel.Sheets(1).Range("D2").Select()
                oExcel.Sheets(1).Application.Selection.PasteSpecial(Paste:=-4163, Operation:=-4142, SkipBlanks _
    :=False, Transpose:=False)





'選取計數器,要在適當時候初始化

'開啟分割畫面之前
確定結束編輯模式

'有變色初始化問題
MouseLeave,有時候會超越索引直

'新開瀏覽檔案,
無法匯入資料問題
不會走 Drop

1.新檔案,就瀏覽檔案
2.舊檔案,新瀏覽檔案

目前可以加入
但是有時候drap index 會是 -1 初始化狀態
有點怪

關閉頁籤以後,再重新打開
drag會發生 抓不到 row的問題

發現問題出在 GridView沒有完全釋放
再關閉業籤的時候做datasource = nothing
並且釋放就可以了


'收合panel2時,有機會判定view是在panel2,
造成panel1拖放寫入自己問題


'托放測試
有變色問題

可能需要在滑鼠離開 View 的時候,
把離開的 View 顏色初始化

再來是把托放作業的顯示樣式
在Drop以後初始化



'點選有問提

每次第一次進入 View 點選
會先走 mouse down
再點一次,就走cell click
再點一次 mouse down 循環

可能需要全部寫在 mouse down
拿掉 cell click



'可能需要開啟分割拿掉選取
開分割視窗
1.拿掉選取
2.鎖調其他按鈕
3.開放拖拉動作



'panel2跑出來的時候
panel1可視區域會被覆蓋

重繪 gridview 沒用

猜測應該是要重繪scroll
或是說要重新嵌入之類的

要再查查看

SplitterDistance 分隔線位置
感覺還是要重新繪製
光條分隔線位置不會影響panel內容的scroll bar 位置

好像因為 scroll bar 是在 form 上面的 gridView 之上
變成說感覺form會被蓋過

每次container大小有變動
就重新設定form的大小

再來是手動更改分隔線位置
寫入 splitcontainer.splitter_Moved事件
去改 form的大小
但是會有點慢(放大縮小動作)

應該要再修



'檢查非以開啟編輯檔案

'瀏覽檔案的儲存

'看能不能接受開啟兩個檔案
兩個view ,用選取拖拉的方式轉移檔案

Winform中DataGridView控件实现拖动行,并在拖动状态中目标行上显示一条红线。

'滑鼠按住
mouseDown
'滑鼠移動
mouseMove
'拖動過程
dragOver
'拖動放下
dragDrop

這個是在自己View上面拖拉移動整個Row

[转帖]C#如何实现DataGridView到DataGridView的拖拽
http://www.csframework.com/archive/2/arc-2-20110612-1553.htm

這是兩個 View 拖拉移動 cell

看能不能兩個合併變成兩個 View 拖拉移動 Row
甚至移動多個 Row


DataGridView.HitTestInfo 類別

包含與 DataGridView 控制項中的特定座標組有關的資訊,例如,資料列和資料行的索引

@看能不能先限制只能在兩個view上面拖動資料
好像可以,但是會有問題說,每次點選都判斷是DragDrop
一直新增

@應該需要個別記憶兩個view的 RowIndex
在跨 view 拖拉時候
去決定要放在另一個view的哪個RowIndex

@應該需要分開自訂兩個class

目前卡在mouse up , mouse down
感覺因為我 down 寫了些什麼
以至於 mouse up 會因為寫入的左右建
作用在釋放的按鈕上


如何區分mouse click 及 mousedown的event ?!

MouseDown + MouseUp 的事件時間距離低於控制台設定時,會在 MouseUp 之後同時觸發 MouseClick
所以會先有 MouseDown + MouseUp ,但不一有 MouseClick 。





似乎mouse_down 是與 mouse_up 相互配合使用的

所以會相互影響



可能需要把拖拉寫在 down

把一般點選改寫入 mouse_click (判斷不是拖拉動作)




Windows Form 中的滑鼠事件



目前大致上可以移動
但是有時候怪怪的
跟進入哪個 view 的判斷有關係

拖動期間,不會走 mouse_Move
直到DragDrop 以後,才會走mouse_Move

把原本 mouse_Move的東西丟到 DragDrop
====================================



'可能需要輸入新資料以後,馬上排序
(或是手動排序)


=====================================
'右鍵選單
複製,貼上

'型別問題,透過直接轉移檔案會有問題

'發現說品名,地區 預帶後
再去改料號,客戶ID
如果資料是錯誤的,
並不會改掉預帶出來的品名,地區

'提示使用者輸入的資料
ErrorText = "此客戶名稱不存在"

當正確應該改回來

沒有留言:

張貼留言