Hello all :)
Θα χρειαστώ τη βοήθειά σας για μία ακόμη φορά :Ρ
Έχω ένα πρόγραμμα, του οποίου ένα κουμπί εμφανίζει μια φόρμα που βγάζει στατιστικές πληροφορίες/Reports.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| Private Async Sub btnTodaysZStat_Click(sender As System.Object, e As System.EventArgs) Handles btnStatZToday.Click
pbStatZToday.Visible = True
StatStatZTodayFormsOpen += 1
lblStatZToday.Text = CStr(StatStatZTodayFormsOpen)
lblStatZToday.Visible = True
Await TaskEx.Run(
Sub()
Dim TodaySelector As New frmZStatisticsSelector
With TodaySelector
.chkZTimePeriod.Checked = True
.dtZFromDate.Value = Today.Date
.dtZToDate.Value = Today.Date
.Opacity = 0
.AutoAction = "Today Database"
.PreventFormFromClosing = True
.ShowInTaskbar = False
.ShowDialog()
End With
End Sub)
StatStatZTodayFormsOpen -= 1
lblStatZToday.Text = CStr(StatStatZTodayFormsOpen)
If StatStatZTodayFormsOpen <= 0 Then
lblStatZToday.Visible = False
pbStatZToday.Visible = False
End If
End Sub |
Η φόρμα
frmZStatisticsSelector
που είναι στη μεταβλητή
TodaySelector τώρα έχει ανοίξει ασύγχρονα, οπότε όσες πράξεις κι αν κάνει μέχρι να τελειώσει, δεν θα επηρεάσει την κυρίως φόρμα.
Όταν κάνει λοιπόν όλες τις πράξεις, θα εμφανίσει μια φόρμα η οποία έχει μόνο ένα data grid view πάνω της και δείχνει τα δεδομένα που της έβαλε η " TodaySelector
" (κάπως έτσι: )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| Dim frmNewSheet As New frmZStatisticsSheet
If File.Exists(DataBaseFile) Then
Call ConnectToDatabasesAndLoadTables()
If ProdsRowCount > 0 Then
Call LoadZTodayMainVariables()
Call ApplyGeneralInfo()
Call CalcPerZNumPerVAT()
Call CalcPerPaymentMethod_Horiz()
Call CalcPerVATPerServer()
Call CalcDiscountDelRet()
AddRows(1)
frmNewSheet.Show()
Else
MsgBox(StrLanguage(42), MsgBoxStyle.Information) 'No Orders match your criteria
End If
Else
MsgBox(StrLanguage(35) & DataBaseFile & StrLanguage(37) & vbCrLf & StrLanguage(62), MsgBoxStyle.Critical) 'file cannot be found! Please specify another path to the database path
frmSettings.Show()
Me.Close()
End If |
(Ναί, ξέρω ότι δεν χρειάζεται να γράφω "call", όμως μου αρέσει γιατί βλέπω ότι καλώ κάτι, μην κολλήσουμε εκεί plz)
Όλα γίνονται τέλεια! Δουλεύουν χωρίς lag, μέχρι και το PrintForm του Sheet (τελευταίας φόρμας, αυτής με μόνο το DataGridView) δουλεύει.
Έχω γράψει επίσης ένα sub που μετατρέπει το DGV σε Comma Separated Values format (.csv). Άμα το καλέσω δουλεύει κι αυτό.
Όμως όταν πατάω να κάνει save as, δλδ να διαλέξει ο χρήστης σε ποια μεριά να σωθεί το αρχείο, μου βγάζει πρόβλημα στο .ShowDialog του SaveFileDialog.
Το πρόβλημα είναι:
1
2
3
4
| System.Threading.ThreadStateException: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.
at System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)
at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
at System.Windows.Forms.CommonDialog.ShowDialog() |
Το SaveAs είναι το εξής:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| Private Sub SaveAs()
Try
sfdExport.FileName = ""
sfdExport.InitialDirectory = strDataDir
sfdExport.DefaultExt = ".csv"
sfdExport.FileName = DefaultSaveFileName & sfdExport.DefaultExt 'Today's Statistics or something similar
sfdExport.Filter = strLanguage(4) & "|*.csv|All Files|*.*" 'Comma-Separated Values Files
Dim SaveDialogResult As DialogResult = sfdExport.ShowDialog()
If SaveDialogResult = Windows.Forms.DialogResult.OK Then
Dim Success As Boolean = Save_dgv_To_csv(sfdExport.FileName, dgvZStat)
If Success Then
MsgBox(strLanguage(2) & sfdExport.FileName, MsgBoxStyle.Information) 'The file has been successfully saved.
End If
End If
Catch ex As Exception
MsgBox(ex.ToString)
CreateCrushFile(ex.ToString)
End Try
End Sub
|
τη μετατροπή σε csv την κάνω έτσι:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| Public Function Save_dgv_To_csv(ByVal FileName As String, DataGrid As DataGridView, Optional ByVal IncludeColumnNames As Boolean = False, Optional LastSaveFile As String = "") As Boolean
Try
Dim ExportationText As String = String.Empty
If IncludeColumnNames Then
For i As Integer = 0 To DataGrid.ColumnCount - 1
ExportationText &= """" & DataGrid.Columns(i).HeaderText & ""","
Next
End If
For j = 0 To DataGrid.RowCount - 2
ExportationText &= vbCrLf
Dim CurrentLine As String = ""
For i = 0 To DataGrid.ColumnCount - 1
If IsNumeric(DataGrid.Rows(j).Cells(i).Value) Then
CurrentLine &= """" & DataGrid.Rows(j).Cells(i).Value.ToString.Replace(",", ".") & ""","
Else
If DataGrid.Rows(j).Cells(i).Value IsNot Nothing Then
CurrentLine &= """" & DataGrid.Rows(j).Cells(i).Value.ToString & ""","
Else
CurrentLine &= """" & ""","
End If
End If
Next
ExportationText &= CurrentLine
Next
ExportationText = ExportationText.Substring(0, ExportationText.Length - 1)
WriteText(FileName, ExportationText)
LastSaveFile = FileName
Return True
Catch ex As Exception
Return False
End Try
End Function |
Καταλαβαίνω ότι το πρόβλημα υπάρχει γιατί έχω καλέσει Async την πρώτη φόρμα (TodaySelector), το θέμα είναι.. υπάρχει τρόπος να έχω καλεσμένη Async τη φόρμα ΚΑΙ να μπορώ να εμφανίσω το SaveFileDialogue?
Τι μου προτείνεται να κάνω?