|
I know how to determine how many lines per printed page in .net
Private Sub pd_PrintPage(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)
Dim linesPerPage As Single = 0
linesPerPage = ev.MarginBounds.Height / printingFont.GetHeight(ev.Graphics)
end sub
Is there a way I can determine how many characters will fit on a line before hitting the left margin, based on font?
I have a report that can get very long. I want to break long lines to print on separate pages so the report could be viewed on two pieces of paper side by side.
Thanks
Ryan
|
|
|
|
|
I think Graphics.MeasureString is what you are looking for. You can the size of print area, then you can find the size of text you are printing.
जय हिंद
|
|
|
|
|
I had been looking at the MeasureString method, and was not sure if there was a better way. I just want to clarify that there is not a better way to use MeasureString than the way I am doing it right now. By the way because this is a text report, I am using the Courier New font, so all characters are the same width. Code Snippet Below:
***************************************************************************************
Private Sub buildReport(ByVal ev As System.Drawing.Printing.PrintPageEventArgs)
Dim line As String = ""
Dim LinesIfPrinted As Int16 = 0
'Get the longest line of text in the report
For LineIndex As Int16 = 0 To strLines.Length - 1
'strLines is a text array with each line of the report
If strLines(LineIndex).Length > line.Length Then line = strLines(LineIndex)
Next
'Find Out How Many Pages
ev.Graphics.MeasureString(line, printingFont, ev.MarginBounds.Size, System.Drawing.StringFormat.GenericTypographic, CharactersPerPage, PagesToPrint)
'PagesToPrint is set to how many lines the longest text of the report is
'Thus I know how many pages this line will require.
ReDim LinesToPrint(PagesToPrint - 1, strLines.Length - 1)
'This is what I think could be more efficient. Currently I shorten the
'longest line of text by one ASCII character, until the LinesIfPrinted
'Variable is equal to 1. Than I know how many characters fit on a single
'line.
For CharIndex As Int16 = 1 To line.Length - 1
ev.Graphics.MeasureString(line.Substring(0, line.Length - CharIndex), printingFont, ev.MarginBounds.Size, System.Drawing.StringFormat.GenericTypographic, CharactersPerPage, LinesIfPrinted)
If LinesIfPrinted = 1 Then Exit For
Next
'Next I build the multidimenstional array with each line of text
'and if it is longer than CharactersPerPage I break it into separate
'pages.
<this code="" left="" out=""> End Sub
*************************************************************************************
So my question is if there is a more efficient way to determine how many characters fit on a line without using the For CharIndex as Int16 = 1....... block of code?
Thanks
Ryan
|
|
|
|
|
Yes and no. If the font you're using is a fixed-width font, then yes, you can figure it out. If you're using a proportional spaced font, then each line can take a different number of characters because each character takes up a variable width.
|
|
|
|
|
Doesn't the measurestring solve this? (provided he does it for every line)
|
|
|
|
|
To a point. There's some extra math you have to do to get just the one line in characters. If you send a string that's too big, it'll wrap down the the next line, or just cut off the rendered image, but not tell you how many characters are on the line that you wanted.
|
|
|
|
|
True, didn't say it was easy just possible
|
|
|
|
|
Nothing is ever easy, is it??
|
|
|
|
|
hi
modified 28-Nov-12 8:52am.
|
|
|
|
|
vijay2482 wrote:
If m <> -1 Then
If m = -1 Then
there you have your problem. You got m <> -1 and m = -1 . Well only one of them is true. Don't you think so?
Yusuf
Oh didn't you notice, analogous to square roots, they recently introduced rectangular, circular, and diamond roots to determine the size of the corresponding shapes when given the area. Luc Pattyn[^]
|
|
|
|
|
m = name.IndexOf("Groupe")
If m <> -1 Then
sw.WriteLine(LTrim(name))
End If
this is right...
but even then i dont get the output
|
|
|
|
|
So what are you expecting LTrim to return?? It removes all whitespace characters from the left end of a String, like Tab and Space. If there are character values higher than these than don't have a glyph image, or has just a box image, those characters will not get removed.
You'll have to explain what you mean by "doesn't work".
|
|
|
|
|
i want to shift the line left by 2 characters
|
|
|
|
|
No kidding, you already said that.
What I asked you is, do you know what LTrim does?? How is it suppoed to know you want to move the characters to the left, by 2 places, since you didn't specify anything like that in any of your code?
|
|
|
|
|
vijay2482 wrote: f the index "Groupe" is found in name,i want to write the line altering the name by shifting it left by 2 places...
To me it sounds like you need to do a mid (getting a section of a string) vs instead of a LTRIM (trimming spaces).
vijay2482 wrote: If m = -1 Then
Agreed w/ above poster - that's whack.
Any suggestions, ideas, or 'constructive criticism' are always welcome.
"There's no such thing as a stupid question, only stupid people." - Mr. Garrison
|
|
|
|
|
Hi all
Quick question, how do I format a number, say 34 to 034, just for better presentation? (I'm currently using String.Format("{0}", newPartNumber) )
Thanks
|
|
|
|
|
|
Use tostring Function to Convert string Format. .Tostring("Formatofdata")
Val1= 1
Str1 = Val1.ToString("000")
//Value of Str1is 001
Best Regard
Anubhava Dimri
mailto: anubhava.prodata@gmail.com
|
|
|
|
|
here is my code
<dim openfiledialog="" as="" new="" mode="hold"> Dim filetoread As String
OpenFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
OpenFileDialog.ShowDialog()
filetoread = OpenFileDialog.FileName
Dim filestream As StreamReader
filestream = File.OpenText(filetoread)
Dim readcontents As String
readcontents = filestream.ReadLine
Do While Not filestream.EndOfStream
readcontents = filestream.ReadLine
Loop
Dim textdelimiter As String
textdelimiter = ","
Dim splitout = Split(readcontents, textdelimiter)
txtt24import.Text &= readcontents
filestream.Close()
Dim sql As String = ""
If txtt24import.Text.ToString = "" Then
End
End If >
|
|
|
|
|
So where are you stuck?
What is happening and what should be happening?
Any error?
From what I can see you read all the lines off a text file line per line (you could simply use the method 'readtoend' for that) and each time overwrite your variable 'readcontents' so you actually only have the last line in the file.
|
|
|
|
|
Hi there,
No there are no errors the problem is that i dont want to use the method 'readtoend'
this is the format of the textfile
123213,john,Smith,Stanchart,xxxxx,2000,27/03/2009
123213,john,Smith,Stanchart,xxxxx,2000,27/03/2009
123213,john,Smith,Stanchart,xxxxx,2000,27/03/2009
123213,john,Smith,Stanchart,xxxxx,2000,27/03/2009
i want to read each line and insert them into a table in the db. The table is in the same format but when i 'readtoend' i will have a problem inserting the values..
Can you also assist on how to read from a path and not reading the contents into the file textbox.
Thanks in advance.
|
|
|
|
|
Following the question above,
I think I know how to add it to a combobox or a datagrid, but I have no idea how to get it to run as a queue. Any ideas on this? Much help is aprreciated
Quin
|
|
|
|
|
Simple - you don't. A combobox was designed to show a list of display values, not maintain a queue. If you really need a queue, there's a Queue collection in the System.Collections and System.Collections.Generic namespaces.
The only problem is that you can't bind the combobox to the queue. You can, however, create an array that IS bindable by calling the queue's ToArray method and binding the combo to the resulting array.
Another alternative is to create your own custom collection that uses a queue internally, but also exposes itself as bindable by implementing the IList interface[^]. (Sorry, IBindingList won't work with the ComboBox)
modified on Wednesday, March 25, 2009 12:18 PM
|
|
|
|
|
Thanks for the fast reply. Then is it possible to bind data selection from the combobox and put it into a queue list? But I want to display this queue list, should I use datagrid view or something else?
|
|
|
|
|
You can bind a different list to the combo, or just add each item individually. As for the queue, you just handle the selection changed event of the combo and add the item to the queue as required.
|
|
|
|
|