2013年2月19日 星期二

[學習] 讓視窗保持在最上層


(一)
Dim frm備註 As New 詢價單備註編輯
frm備註.MyCallForm = Me
frm備註.ShowDialog()




(二)
此段程式碼是寫在同一個視窗(Form)

ShowDialog 的焦點會一直在被開啟的Form上
與之不同的是 Show 的焦點不會在開啟的Form上

所以當開啟時若要一直在焦點上的話
就必須在主視窗的Activated事件下寫段程式

又因為被開啟的Form 並不是MDI表單
所以必須在 Application.OpenForms 下去搜尋

在圖一的紅色框的範圍內連點兩下,則會使主視窗縮放
在紅色框外及黃色框外的範圍都無法點擊
雖然可點擊黃色框內的 button,但都是沒有反應的(ex:會更新主視窗的資料)
應該是因為 Activated 事件觸發後,其它事件(或反應)就會被攔截掉...(尚待解釋)
而 ShowDialog 則除本視窗外,其它視窗都無法點擊

Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click

     Dim frm As New 詢價單費用編輯
     'frm.TopMost = True
     'frm.Owner = Me.ParentForm
     'frm.Parent = Me.ParentForm
     'frm.Focus()
     'frm.Activate()
     frm.Show()
End Sub



Private Sub 詢價單資料輸入作業_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
        For Each f As Form In Application.OpenForms
            If f.Text.Equals("詢價單費用編輯") Then
                f.Activate()
                Exit For
            End If
        Next
End Sub




(三)
若要讓視窗長駐最上層
則使用 TopMost = True
此時的可以點擊其它視窗
只是被開啟的視窗會一直長駐在最上層而己
即使使用者切換至其它應用程式



Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click

     Dim frm As New 詢價單費用編輯
     frm.TopMost = True
     'frm.Owner = Me.ParentForm
     'frm.Parent = Me.ParentForm
     'frm.Focus()
     'frm.Activate()
     frm.Show()
End Sub




而(一)及(二)
當使用者點選其它應用程式時,並不會顯示在最上層。



參考:
vb.net find form by title and edit control
VB.net視窗控制問題
利用SetWindowPos使表單永遠放到最上層!
如何在VB裡讓程式表單能夠最上層顯示
如何將 Form 顯示在最上層?
如何顯示其他Form卻又不讓其獲得Focus?
vb.net 轉移程式焦點
VB.Net Form關閉按鈕以及最上層顯示問題
請問如何讓開啟的form只在此視窗中最上層顯示
請問視窗最上層的問題
最上層FORM的鎖定
VB.Net Form顯示為最上層
當程式的前景被其他程式拿走時判斷並拿回前景
[C#]透過 SHDocVw 與 GetForegroundWindow 取得正在使用的 Internet Explorer 網址
[VB.NET]把.NET視窗嵌入.NET視窗或控制項

2013年2月5日 星期二

[除錯] ComboBox 繫結 DataSource 顯示 System.Data.DataRowView

程式:
Dim sqlQuery1 As String = "SELECT (convert(nvarchar(4),系統ID) + '(' + 系統名稱 + ')') as 系統 FROM [Usys系統別資料表] WHERE 系統ID <> 0;"
dt_Sys = basic.reDataset(sqlQuery1, Nothing, Nothing)

   For Each row As DataRow In dt_Sys.Rows
        If row.Item(0).ToString = "0" Then
             'way1 / way2
             ComboBox1.Items.Add(row.Item(0).ToString)
        End If
     Next

'dataTable 是可以顯示正常的...
'MsgBox(dt_Sys.Rows(0)("系統").ToString)

(way1) combobox1 每個row都顯示 System.Data.DataRowView
ComboBox1.DisplayMember = "系統"
ComboBox1.ValueMember = "系統"
ComboBox1.DataSource = dt_Sys
[C# CODE] 參考... 轉型 DataRowView
foreach(var dr in cbo_客戶編號.Items)
{
    MessageBox.Show(((DataRowView)dr)["中文名稱"].ToString());
}


(way2) 正常
For Each row As DataRow In dt_Sys.Rows
     ComboBox1.Items.Add(row.Item(0).ToString)
Next

備註:
我的程式裡並沒有 SelectedIndexChanged & SelectedValueChanged 的事件...
參考的資料無法解決問題…
還是(use way2)照原方式處理
但效率比較差...

2013/02/18 改way1 又正常了XD
應該跟以下有關係: (把obj的方式 變更為 datatable 就解決了)
form1
    'cbbox1 系統 資料繫結
    Dim dt_Sys As DataTable = New DataTable
    Public Property _dt_Sys() As DataTable
        Get
            _dt_Sys = dt_Sys
        End Get
        Set(ByVal value As DataTable)
            dt_Sys = value
        End Set
    End Property

    'Private obj As Object()
    'Public Property cbbox1() As DataTable
    '    Get
    '        cbbox1 = obj
    '    End Get
    '    Set(ByVal value As Object)
    '        obj = value
    '    End Set
    'End Property

     '將 combobox1 的item 複製到 系統別的combobox1
     'obj = New Object(ComboBox1.Items.Count - 1) {}
     'ComboBox1.Items.CopyTo(obj, 0)

form2
      '將form1的combobox1上的所有item 加入到 form2的combobox1
      'ComboBox1.Items.AddRange(Me.MyCallForm.cbbox1)

參考:
combobox.DisplayMember property
自訂ComboBox的DisplayMember及ValueMember
DataSet&DataTable如何绑定下拉列表控件获取不重复的值,如何添加一列自定义文字,并在下拉列表控件中显示自定义文字
Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题
C#comboBox的DataSource获取数据显示System.Data.DataRowView
#VB ComboBox 問題集