|
I assume you've got an db-view connected to the report. Normaly you don't have to provide the connection string anymore (it's hardwired into the generated report-class), if not you can allways use the DataSource-property of the report.
To show the report you need the CrystalReportViewer-Control (well it should be named something like this). Just put it on a form and set the ReportSource - property of the control to an instance of your report-class (same name as your report - get's generated - sometimes CR has problems with namespaces so look into the object browser) - that's it.
If you just want to print the report you can use the print-functions of the report without the viewer (same for exports - great for PDFs and so on).
Bye the way: I normaly use CR with datasets (so I greate an dataadapter for the dataview I like to see, create the CR with this dataset and then do something like:
<br />
dim report as new CrystalReport1<br />
report.SetDataSource(ctype(dataadapter.GetData(),DataTable))<br />
crviewer1.ReportSource = report<br />
This way I can pass parameters for the view in GetData (if I have any) - filtering in CR tended to be done on the client (i.e. all the data of the table/view was passed to the report and THEN filtered - don't know if this is still the case but I use the above approach anyway ... )
|
|
|
|
|
I could not find my previous message. So I posted it again with update from Dave Kreskowiak.
Dave: Thanks for your information. I tried your suggestion. However, I could not call Paint Event in sequence. Could you check my simplified code below? Thank you.
Public Class Form1
Dim gl As Integer = 0
Private Sub measure()
Dim i As Integer
For i = 0 To 16
gl = i * gl
If gl = 256 Then
gl = 255
End If
Panel1.Invalidate()
System.Threading.Thread.Sleep(200)
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Panel1.Invalidate()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
measure()
End Sub
Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
Panel1.BackColor = Color.FromArgb(gl, gl, gl)
End Sub
End Class
------------------------------Replay from Dave Kreskowiak on 12/2/07 --------------------------------
You cannot put this loop and sleep code in the paint event. Think of the Paint event like a moment in time. It's used to paint a single frame of an animation.
Move the loop and sleep code outside the Paint event and keep track of what the Paint event needs to draw what you want outside the event code. Inside your loop, you update the variables holding the data the paint event needs, call Invalidate on your panel control, then Sleep.
A guide to posting questions on CodeProject[^]
Dave Kreskowiak
Microsoft MVP
Visual Developer - Visual Basic 2006, 2007
------------------------------ Original message-----------------------------------------------------
I used e.Graphics.Clear in Panel.Paint to change gray level of the Panel. Thread.Sleep() was added to set a time delay between pattern update and measurement. However, this delay function did not work as I expected. Image pattern would be updated after Thread.Sleep(), and take measurement right away. I wonder how you add delay function in VB.NET. Please advise this question. Thank you.
Steven
Public Sub PanelPG_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PanelPG.Paint
for i = 0 to 16
gl = i * 16
e.Graphics.Clear(Color.FromArgb(gl, gl, gl))
System.Threading.Thread.Sleep(200)
objCa.Measure()
Next i
SaveData()
End Sub
|
|
|
|
|
Well I'm not sure if the code will work this way (you will block your GUI-thread with the Sleep) but I won't sugguest doing it this way.
Why don't you use a timer?
By the way: you are handling the Paint-event and in there you are setting the BackColor, normaly you will want to do the actual drawing inside the Paint event!
Try using a timer that is called every 200ms that will update the BackColor of your panel that should do the work.
(By the way: if you need a lot of these things inside your app you might consider moving to WPF - you will get all this for free without doing the coding by yourself )
|
|
|
|
|
I implemented Timer, but measure() is still called right after Paint Event. Does this mean I need to apply multithreading to make sure Paint Event finishing image update? Is there any tip about how I can apply multithreading in my code?
Thanks.
|
|
|
|
|
No, multithreading will not solve this and will actually make it far more difficult to fix.
Measure is being called when that line executes, in the order it's shown, not after the method it's in finishes.
The reason the code doesn't paint is because immediately after you call Invalidate, you put the UI thread to sleep, and all the drawing with it! Your code never gives the forms message pump time to execute to see the Paint message it's giving and let the Paint event code execute. This is going to be a hacked up way of doing this (with side effects you didn't count on,) but, replace the Thread.Sleep line with Application.DoEvents() .
DoEvents releases control to the applications message pump so it can process and dispatch all the pending window messages that have been queing up while your code has been executing, including WM_PAINT messages.
|
|
|
|
|
Thanks for replay.
However, I tried Application.DoEvents(), but I need some function like Thread.Sleep to add delay between Paint Event and Measure(). Otherwise, I still have Measure() happened too fast before Paint Event finished displaying image. Please advise. Thank you.
PanelPG.Invalidate()
t1 = VB.Timer
Do While VB.Timer < t1 + 1
Application.DoEvents()
Loop
Measure ()
|
|
|
|
|
Simple. Insert the Sleep line after the DoEvent line.
I just re-read your code. Putting the Sleep line in this code will stop the UI thread and keep the Paint messages from being processed. You can't put the Sleep line in here at all.
Without seeing the rest of this code, what measure does, and what you want this to do, it's impossible to tell you exactly what to do to fix this. Alot of this problem appears to be comming down to a design problem.
|
|
|
|
|
Hi, Dave:
Thank you very much for your response. I finally got it working after applying two sleep function before and after Measure(). This is somewhat not very efficient. But additional delay gives me a work application at least.
Steven
modified on Monday, December 10, 2007 5:50:01 PM
|
|
|
|
|
I'm unclear how to get control again of a .dll after unloading the domain. I thought the unload would free the file, but it does not seem to. the final line here does not allow the file delete. How do I release it?
Thanks in advance!
Dim SubDomain = AppDomain.CreateDomain("New Domain")
Dim as1 As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("MA.dll")
Dim IndicatorClass = SubDomain.CreateInstanceAndUnwrap as1.FullName, "Indicators.Indicator")
AppDomain.Unload(SubDomain)
File.Delete("MA.dll")
|
|
|
|
|
You don't. It'll stay locked so long as your app is running, even if you're not using the code in the .DLL, it's still loaded into your process. There is no way to release the lock without unloading your app.
Why would you want to delete a .DLL anyway??
|
|
|
|
|
My idea is (was?):
1. Load the .dll into a new, separate app and use it.
2. Unload the separate app, allowing the user to edit the .dll (through VBCodeProvider)
3. Reload the new, edited .dll into the separate app.
Honestly, I thought that was the whole idea of the separate app created with CreateDomain -- to allow the user flexibility over loading and unloading apps while keeping the main app running. Have I missed something, or am I not doing this the right way?
|
|
|
|
|
I am using a binding source and when I assign the binding source to a dataTable I get an error that says I used the variable "bsMonStoreSched" before assigning it a value, a green line shows up under the binding Source.
Here is my code. Is there something I am doing wrong?
Also, can I use a single binding source instead of using a different binding source for each item I filter?
If you notice below I used the same dataTable and assigned it to multiple binding sources. Can I do this with one binding source?
Here is the code.
' declare variables<br />
Dim bsMonStoreSched As BindingSource<br />
Dim bsTuesStoreSched As BindingSource<br />
<br />
' create table adapter objects<br />
Dim hoursTableAdapter As New DataSetTableAdapters.tbl_hoursTableAdapter<br />
Dim schedTableAdapter As New DataSetTableAdapters.tbl_store_schedTableAdapter<br />
<br />
' create data set objects<br />
Dim lpDataSet As New DataSet()<br />
<br />
' create dataTables<br />
Dim dtHours, dtSched As New DataTable()<br />
<br />
' fill the dataTables<br />
Try<br />
hoursTableAdapter.Fill(lpDataSet.tbl_hours)<br />
schedTableAdapter.Fill(lpDataSet.tbl_store_sched)<br />
Catch err As Exception<br />
MessageBox.Show(err.Message)<br />
End Try<br />
<br />
dtHours = lpDataSet.tbl_hours<br />
dtSched = lpDataSet.tbl_store_sched<br />
<br />
' Set the binding Source for mon - tues<br />
bsMonStoreSched.DataSource = dtSched ' The green line shows up here<br />
bsTuesStoreSched.DataSource = dtSched<br />
<br />
' Filter the items to show results.<br />
bsMonStoreSched.Filter = "ss_day='Monday'"<br />
bsTuesStoreSched.Filter = "ss_day='Tuesday'"
|
|
|
|
|
You did exactly what the error said you did. You declared two variables that don't point to actual objects of type BindingSource. Depending on what this code is really supposed to be doing, the error is saying that you need to change the first two lines in this snippet to:
' declare variables
Dim bsMonStoreSched As New BindingSource()
Dim bsTuesStoreSched As New BindingSource()
I really doubt you'd be doing this in a method then abandoning the bindingsources. It would appear the you're actually trying to use bindingsources that you already have in your form, in which case, you wouldn't need the first two lines of code, but you would have to change the two lines where the squiggles show up, and the lines thereafter, to use the names of the bindingsources you already have on the form.
|
|
|
|
|
I am calling the binding source programatically instead of dragging and dropping the binding source and table adapter into the forms. When I was using the designer to create the binding source, data table and table adapter the forms designer was generating code that caused the desginer to not show up.
|
|
|
|
|
I need to execute a query to a table names tbl_store_sched where if the table column ss_day has a row that has Monday in it then the monday checkbox will get checked and the selected value for a combo box will be the same as the column ss_from. The combo box is populated from tbl_hours.
I figured I would use the tableAdapter.FillByTableColumn method but when I write the code the words fillBy end up with a blue line under them.
Is the TableAdapter.FillBy method the best way to do this?
Is there a way to just get all the results from the database table and then check those results to see if the rows exist or what information is in the row?
Can I just fill the dataTable using schedTableAdapter.Fill(lpDataSet.tbl_store_sched) and then get the results from certain rows and columns?
I will need to use data from this table for several checkboxes and combo boxes and I don't want to have to execute multiple queries.
|
|
|
|
|
You're getting the quiggly line because your tableadapter doesn't have a method called FillBySomething. You have to right-click the methods in dataset designer and click "Add Query...", supplying the SQL statement and options to generate the FillBy... method code.
|
|
|
|
|
Would it be better for me do a bunch of fillBy Methods or to use a binding source?
Wouldn't it slow my program down to do a bunch of FillBy Methods, being that each time I do it is represents a database query?
I have about 14 different combo boxes that all populate from the hours table. The difference between them is that when the user chooses a time in the combbo box they each store that time in the database and then when the user navigates to the store schedule tab the value that was stored in the database is the selected value in the combo box.
Here is tbl_store_sched
create table tbl_store_sched (<br />
ss_id int NOT NULL IDENTITY(51000,1),<br />
store_id int,<br />
ss_day text,<br />
ss_from text,<br />
ss_to text,<br />
primary key(ss_id),<br />
foreign key(store_id) references tbl_store(store_id));
If the user checks the Monday check box. They then will proceed to select a from time and a to time. Once they do this the day "Monday" is stored in the column ss_day and the from and to time are stored in ss_from and ss_to.
|
|
|
|
|
AAGTHosting wrote: Would it be better for me do a bunch of fillBy Methods or to use a binding source?
That depends on what your app does and the design of your app. Noone can tell you either way.
AAGTHosting wrote: Wouldn't it slow my program down to do a bunch of FillBy Methods, being that each time I do it is represents a database query?
If this is what your business rules require, then yes, you put these in.
AAGTHosting wrote: I have about 14 different combo boxes that all populate from the hours table. The difference between them is that when the user chooses a time in the combbo box they each store that time in the database and then when the user navigates to the store schedule tab the value that was stored in the database is the selected value in the combo box.
Here is tbl_store_sched
As for the rest, it looks like you really need to rethink how you're storing data in your tables. If a column is storing only the day of the week, you really don't want to do it using the full name of the day. A number field would do it and take up far less space in the database. Also, you're storing times as string in the database - wrong. Store them as time values, not strings. This will make data retrieval much easier and you'll avoid weird results with sorting and functions.
|
|
|
|
|
If I am going to store a time such as 3:00PM in the database and store it as a time not as a string, should I be using a date time picker? As far as I know the date time picker will not do time only. Right now I am using a combo box that has a list of times to choose from.
Greg
|
|
|
|
|
That doesn't change the fact that you're making a big mistake storing time values as strings in the database.
|
|
|
|
|
Initial Problem:
When Imaging numerous computers, they use the same SigmaTel device - and the DeviceID is the same. However, each different model MUST use a different driver version or the SigmaTel sound driver will not function. (That's messed up! - who wrote these Gateway model drivers!)
So... we're trying to develop a script that recognizes/pulls the DeviceID and Model, then depending on what computer model and DeviceID is found, then the correct driver should be loaded.
The VBS problem: The IF statements do not seem to be reading in the string variables (the objItem.Name). It does not seem to read it and is blank.
Anyone have any suggestions / solutions on this one! Any help is appreciated.
======Code:
On Error Resume Next
strComputer = "."
strName = objItem.Name
Dim objFSO ' File System Object
Dim objShell ' Window Shell Object
Dim ObjExec ' Execute command in Shell
Dim strResult ' Output from command execution
Dim strDeviceID ' Device ID of whatever we've found
Dim strDeviceIDShort ' Four-digit ID of device
Dim strDeviceIDLong
Dim strDeviceDesc ' Text description of device
Dim intNumDevices ' Just in case there's more than one, we'll want to know
Dim arrTemp
Dim strTemp
Dim Counter
Dim strComputers ' Computers this might be
Dim strINFFile ' What INFFile we're going to use
Set objShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystemProduct",,48)
'For Each objItem in colItems
'WScript.Echo "whois:" & objItem.Name
'Next
Wscript.Echo
Wscript.Echo "Looking for unconfigured High-Definition Audio Device..."
Wscript.Sleep 500
set objExec = objShell.Exec("c:\windows\devcon find *HDAUDIO\*")
strResult = objExec.StdOut.ReadAll
if InStr(strResult, "device(s)") <> 0 then
arrTemp = Split(strResult, vbcrlf)
If UBound(arrTemp) > 2 then
For Counter = 0 to (UBound(arrTemp) - 1)
If InStr(arrTemp(Counter), "Audio") <> 0 then
strTemp = arrTemp(Counter)
End if
If InStr(UCase(arrTemp(Counter)), "FOUND") <> 0 then
intNumDevices = CInt(Left(arrTemp(Counter), 1))
End if
Next
Else
strTemp = arrTemp(0)
intNumDevices = CInt(Left(arrTemp(1), 1))
End if
arrTemp = Split(strTemp, ":")
strDeviceIDLong = arrTemp(0)
strDeviceDesc = Trim(arrTemp(1))
arrTemp = Split(strDeviceIDLong, "&")
strDeviceID = arrTemp(0)
strDeviceIDShort = Right(Mid(strDeviceIDLong, InStr(strDeviceIDLong, "DEV_"), 8), 4)
Wscript.Echo "Found " & intNumDevices & " Hi-Def Audio Device(s)."
Wscript.Echo "Gathering information..."
Wscript.Echo
Else
Wscript.Echo "There are no Hi-Def Audio Devices present in the system."
Wscript.Echo "Exiting..."
wscript.Sleep 200
End if
For Each objItem in colItems
Select Case strDeviceIDShort
Case "7680"
strComputers = "Gateway E-4500, E-6610"
If objItem.Name = "E-6610D" then
strINFFile = "C:\Drivers\060Audio\010Sigmatel\070AC97\sthda.inf"
ElseIf objItem.Name = "E-6610" then
strINFFile = "C:\Drivers\060Audio\010Sigmatel\070AC97\sthda.inf"
ElseIf objItem.Name = "E4500" then
strINFFile = "C:\Drivers\060Audio\010Sigmatel\040AC97\sthda.inf"
ElseIf objItem.Name = "E-4500D" then
strINFFile = "C:\Drivers\060Audio\010Sigmatel\040AC97\sthda.inf"
End If
Case "7618"
strComputers = "Gateway E-4610, E-4610D"
strINFFile = "C:\Drivers\060Audio\010Sigmatel\040AC97\sthda.inf"
Case "7634"
strComputers = "Gateway M465, M685, E-100M"
strINFFile = "C:\Drivers\060Audio\010Sigmatel\020AC97\sthda.inf"
Case "7690"
strComputers = "Gateway E-475M, E-100M"
strINFFile = "C:\Drivers\060Audio\010Sigmatel\050AC97\sthda.inf"
Case Else
strComputers = "Unknown computer system"
strINFFile = "Not making any changes."
Wscript.Quit
End Select
Wscript.Sleep 350
Wscript.Echo "Driver Device ID: " & StrDeviceIDShort
Wscript.Echo "Device Description: " & strDeviceDesc
Wscript.Echo "System Device ID: " & strDeviceID
WScript.Echo
WScript.Echo "Possible Systems: " & strComputers
WScript.Echo "Device Driver to use: " & strINFFile
Wscript.Echo
Wscript.Echo "Attempting to update driver..."
WScript.Echo "whois:" & objItem.Name
Next
'WScript.Quit
Set objExec = objShell.Exec("c:\windows\devcon updateni " & strINFFile & " " & strDeviceID)
Wscript.Sleep 5000
strResult = objExec.StdOut.ReadAll
Wscript.Echo strResult
DFG
|
|
|
|
|
The problem could very easily be with WMI. Mmotherboard/machine/device manufacturers are not required to provide any information to WMI about the components. If they do, it's usually not complete information either. It's also entirely possible that some devices from a manufacturer will fill in some of the details and others won't fill in any at all.
|
|
|
|
|
WMI and the script appears to be capturing the name.
After looking at this a little bit further, it appears objItem.Name does not return a "text" string, therefore, our IF compare never produces a match.
Is there a way to get the return value to be read as a text string?
DFG
|
|
|
|
|
That depends on the object returned by Name. It should be a string, but could also be Nothing or some other object. The only way to attempt a conversion is to wrap it in a CStr() function call.
Dim name = CStr(objItem.Name)
|
|
|
|
|
How do I determine the output directory of a project (the place where temporary files are extracted)?
Many thanks!
|
|
|
|