2012年1月10日 星期二

#LinQ Linq 基本語法 – OrderBy 與 OrderByDescending


Linq 基本語法 – OrderBy 與 OrderByDescending



    Structure Pet
        Public Name As String
        Public Age As Integer
    End Structure

    Sub OrderByEx1()
        ' Create an array of Pet objects.
        Dim pets() As Pet = {New Pet With {.Name = "Barley", .Age = 8}, _
                             New Pet With {.Name = "Boots", .Age = 4}, _
                             New Pet With {.Name = "Whiskers", .Age = 1}}

        ' Order the Pet objects by their Age property.
        Dim query As IEnumerable(Of Pet) = _
            pets.OrderBy(Function(pet) pet.Age)

        Dim output As New System.Text.StringBuilder
        For Each pt As Pet In query
            output.AppendLine(pt.Name & " - " & pt.Age)
        Next

        ' Display the output.
        MsgBox(output.ToString())
    End Sub

#LinQ 透過LinQ做Table多欄位的 Distinct

透過LinQ做Table多欄位的 Distinct

或是 直接做
tbl.DefaultView.ToTable("DistinctTable", True, columnNames)

其中 columnNames 先透過 LinQ 去建立 Table所有欄位名稱的 String()

Dim columnNames As String() = _
   (From tbl In myTable.Columns.Cast(Of DataColumn)() _
   Select tbl.ColumnName).ToArray()


LINQ To Entity同時使用OrderBy與Distinct的小技巧

#VB AccessViolationException

'碰到說透過呼叫PDFViewer控件
開啟PDF檔案,OK沒問題
但後端處理判斷JPG檔案,

計算JPG檔案的Frame數的時候出了問題
(其實JPG檔應該就一個Frame,或許這邊要再改一改)


FreeImage.OpenMultiBitmapEx() 還沒事
在FreeImage.CloseMultiBitmapEx()這邊
發生 AccessViolationException
嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀。




如果單純用原始PDFViewer去開啟JPG
則沒有這方面問題


目前透過判斷 JPG 檔案  不做 TIFF計算頁數的方式
單純設定Frame = 1 
就OK了

至於原因 大概可以參考

使用程式自動輪播切換視窗

可能是物件的一些問題吧
要再研究

2012年1月9日 星期一

#VB 已經加入 dll API參考函式庫,卻發生找不到 dll 模組的問題

碰到說 已經在專案下, 加入 DLL 參考元件
撰寫上也能夠自由呼叫使用 DLL 下的物件

編譯上也沒問題
測試執行的時候
卻發生

無法載入 DLL 'FreeImage': 找不到指定的模組。


幹~糗了
就跟字面上一樣
少了 FreeImage.dll
原本的專案並沒加入該參考
但是有 FreeImageNET.dll
猜測應該是 FreeImageNET 裡面有呼叫到 FreeImage 裡面的物件,
所以資料夾下面除了有加入專案參考的 FreeImageNET.dll 以外
必須在包含該  FreeImage.dll

2012年1月8日 星期日

@商標圖片歷史異動查詢系統


大致上完成

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

'目前卡在怎麼將TreeView做子節點排序動作
似乎比較好的做法是,搜出所有要加入的節點後,
先做好排序,
再依排序位置加入節點


'有點怪, 本身應該是BackOn商標
BOM表找的到Backon商標
選配也找到同樣料號商標 (不應該在這邊出現)
要再檢查看看


先判斷是否BACKON
如果BACKON商標存在圖檔
建立節點後

(這邊還需要做判斷說,會不會以重複建立節點問題)


走選配將做判斷
不建立BACKON已建立的節點



'篩選條件串接有點怪怪的



'商標料號篩選這邊,
將不能只判斷選配是否存在該料號
應該將BackOn部分與選配商標合併檢查


===================================================
win2k3ad (pdf, jpg)
需要透過(客戶ID-業務代碼)=客戶規格,
去查詢選配該規格有哪些商標圖片,(0~多)
檢查該商標物料號是否為空白半成品(----XF)
If 非空白=>檢查該商標物料號是否屬於BACKON

NOL0 ,NOL1,NOL2 => NOL皆為空白
第11碼 0 => 空白
        非 0 => BACKON商標


判斷有無舊版商標圖片,
建立查詢清單

點選顯示該商標圖片
商標編碼:
(U%) tblStock與圖片存檔數不符 =>檢查料號有無圖片檔存在
(DW% 庫存無該類料號紀錄)
(VC 只有兩種料號)
===================================================
1.透過篩選條件輸入
2.建立TreeView節點,  (判斷料號是否存在JPG,PDF,不管有無都建立,無=>無路徑紀錄)
   i.選配商標
      a.新版 ( 不會有日期檔名 )
      b.舊版 ( 切出停用日期=>應該就是改版日期 )
      ....
  ii.BACKON商標 (透過成品型號,走BOM表,檢查P包裝製程下是否空白半成品)
                              (11馬=>1以上BackOn, 0=>空白)
      a.新版
      b.舊版
      ....
3.點選呈現去找出該節點所記錄的PDF文件位置
   若無路徑紀錄,不顯示PDF,JPG瀏覽圖片,或做些提示
4.目前是只建立有圖檔的 TreeView Node (檔名),
   看需求再改
5.透過PDFViewer開啟PDF瀏覽 (判斷是否JPG檔案,開啟JPG)
===================================================
'要一個篩選介面
1.需不需要提供大範圍模糊篩選
   類似ERP, 底部是一個選配大範圍清單,
   點選後,Show 瀏覽View,讀取載入相關資料
2.輸入
   CustID & "-" & CustSpec = 選配CombCode,
   CustID
   CustSpec
   成品PartCode (XX,一個成品多個選配)
   商標料號

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


決定用這個了,已經寫好能夠完全不透過Adobe讀取PDF文件
在稍微改一下瀏覽介面
弄成自己要的就 好
偷吃步



    '浏览PDF文档的基本步骤是:
    '获得需要浏览的PDF文档对象的页数,以确定页面的数量(iTextSharp)。
    '将PDF文档对象(全部的或者是某一页)转换为既支持单帧又支持多帧的光栅图像格式(GhostScript API)。
    '从图像中获取出需要浏览的当前帧(FreeImage.Net)。
    '将当前帧转换成一个System.Image。
    '在PictureBox控件中浏览当前帧。

    '下面的一些工具类提供了一些辅助性的功能:
    'GhostScriptLib.vb(包含了将PDF转换成TIFF的方法,可以用来浏览或者打印PDF文档)
    'iTextSharpUtil.vb(提供了获取PDF文档中页数、以及将书签转换为TreeNode的方法)
    'PrinterUtil.vb(包含了将图像发送到打印机的方法)
    'ImageUtil.vb(提供了图像的操作,如改变大小、旋转以及格式转换等)
    'PDFViewer.vb(包括了PDF浏览器用户控件)

    '以下5个DLL必须放置在同一个目录下:
    'FreeImage.dll
    'FreeImageNET.dll
    'gsdll32.dll
    'itextsharp.dll
    'PDFView.dll
    '由于文件大小限制的关系,我无法将Ghostscript 8.64 DLL(gsdll32.dll)打包到源代码中,
    '请从sourceforge下载Win32 Ghostscript 8.64 package,并且把gsdll32.dll放置到\PDFView\lib文件夹下,与其他DLL放在一起
    '********************

2011年12月29日 星期四

#VB ScrollBar 限制範圍

1.按下 Scroll 向下鍵
2.觸發設定 FirstDisplayedScrollingRowIndex
3.引發 OnScroll 事件





请问怎样用sendmessage函数向VSCROLL滚动条控件发送滚动的消息?





窗 口 的 自 动 滚 动

透過SendMessage控制功能表項





How To AutoScroll a DataGridView during Drag and Drop


How to detect if a scrollbar is or is not at the end of a richtextbox (vb.net)

========================================================
感覺是因為FirstDisPlayedRowIndex 改變
才引發 Scroll 事件
所以沒辦法單方面改 OnScroll
應該去限制 FirstDisPlayedRowIndex 的最大值
要查看看有沒有辦法

當到達底端,
設定移動變量 = 0
向上移動時,
在設定移動變量 = default

應該可以透過 Reflection 來做
Dim verticalOffset As Reflection.PropertyInfo
verticalOffset = Me.GetType().GetProperty("VerticalScrollingOffset", Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance)
verticalOffset.SetValue(Me, 0, nothing)

抓到映射屬性,但是沒辦法 setValue 
發生
找不到屬性集方法。






                        '判斷是否索引屬性,若params.length = 0 表示該屬性非索引屬性
                        'Dim params = verticalOffset.GetIndexParameters
                        'For Each p As Reflection.ParameterInfo In params
                        '    MsgBox("   Parameter: " & p.Name)
                        'Next



============================================================
不知道為什麼 製令製造書的FirstDisPlayedRowIndex 總是呈現的資料比實際變數抓到的大 1
大致上可以限制了
但是畫面還是可以向下推移,
看能不能限制說當到了限制位置後,ScrollBar的向下或向上就失效


感覺跟FirstDisPlayedRowIndex 比較有關係
看能不能透過事件什麼的,限制FirstDisPlayedRowIndex 只能在設定的最大值以下


你怎麼能做出一個項目的DataGridView滾動一次使用鼠標輪?

這邊可以做到,但是變成說要去寫 MouseWheel事件
keyDown事件
還要去寫ScrollBar持續按下向下箭頭控件事件
都要做類似事情,才有可能不再向下
Cell在編輯狀態下 KeyDown 事件

或是要再查查看其他方法

或是透過WinProc來改寫 {UP},{Down}
1.去判斷是否已經到達最大值
2.持續送出{DOWN},將會無視=>不做任何動作
=========================================================================
碰到說DataGridView資料的垂直捲動軸,當往下拉到底,會拉超過GridView顯示的範圍
變成多出空白行


平行的捲動軸就沒有這個問題


這會造成我在新增資料烈的時候,
因為改變Cell數值造成重新資料鏈結
產生焦點Cell跑掉的問題


看能不能限制垂直捲動軸捲動到最後一筆資料列之後,就無法再向下
(預設可以=>多出空白)





目前透過設定FirstDisplayedScrollingRowIndex去找
應該要限制的Maximum


卡在怎麼抓到正確的原始Maximum


再向上移動的時候,去還原原始Maximum
當又遇到FirstDisplayedScrollingRowIndex時候
再去限制Maximum


再想想
===========================================================



感覺要自訂,去寫出每次變動的量,
然後判斷是不是value到了max
限制value只能到max~0
目前透過row重繪之後,
去判斷最後一筆資料出來了沒
出來了就把焦點限制在最後一筆資料顯示的頁面之上
FirstDisplayedScrollingRowIndex


看能不能之後鎖住Scroll不能再向下拉動只能向上




不然就看能不能委派自訂事件
附加在GridView Scroll事件之下
每次變動,檢查是不是超過max
並且指定只能<=MAX
=======================================================
可以在Gridview的Scroll事件之下
限制e.newValue的數值
去做到控制滾動軸位置的方式(畫面會閃爍)

卡在怎麼抓限制的數值,以及滾動的座標?

可能要計算 Scroll.Max 跟 Gridview.height 之間

@改變max似乎只是改變scrollbar的移動量
並不是絕對位置,而是相對位置


VB.NET DataGridView SCrollBar鎖定



在Scroll事件中如何计算窗口内的row值






Value的范围是从Minimum到Maximum+1-LargeChange, 
你可以根据这个来计算Maximum, 
因为你不需要Value=Maximum就可以完成你的操作。



2011年12月26日 星期一

#VB 透過LinQ將 column轉型(string=>Int32),並且遞增排序


How to convert the column in order by linq





        'String欄位 轉 Int32 遞增排序
        evensQuery = (From task In tblTaskShow.AsEnumerable _
        Select task).OrderBy(Function(task) Convert.ToInt32(task.Item("index")))

        If evensQuery.Any Then
            '最後一筆,即最大index
            _maxMainIndex = evensQuery.CopyToDataTable.Rows(evensQuery.CopyToDataTable.Rows.Count - 1).Item("index").ToString
        End If