|
If you read the documentation for IEnumerator interface and its members, it is documented that an exception is thrown when you modify the underlying collection. This is by design for a reason. If you modify the collection that you're enumerating, there's a good chance that enumerated data was changed which makes your enumerator invalid. Note that the foreach keyword is nothing more than a compiler "alias" for getting the enumerator and looping through it much as you're doing.
One workaround is to clone the Hashtable (see Hashtable.Clone ) and enumerate it, removing the elements from the original. Since cloning the hashtable creates a shallow copy, the keys and values themselves will reference the same object (unless they are value types like int , long , DateTime , etc.).
You could also copy the keys to an array (using Hashtable.Keys.CopyTo ), enumerate that, and call Hashtable.Remove on the keys you want to remove. There's several other workarounds that would work along these lines as well.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
FYI, I saw a link to this[^] on MSDN. I haven't tried it myself, but it apparently allows you to modify a collection while in the foreach loop of that collection.
---------------------------
He who knows that enough is enough will always have enough.
-Lao Tsu
|
|
|
|
|
All this does is return a custom IEnumerator that doesn't keep track of the serial number (version of the enumerator). This is a very bad idea for reasons I mentioned earlier. If the collection over which you're enumerating changes, you should not continue enumerating because the underlying data has changed.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Interesting. Yeah like I said I hadn't actually looked at their code, thought I'd throw it out on the table anyway.
---------------------------
He who knows that enough is enough will always have enough.
-Lao Tsu
|
|
|
|
|
One way to do it is to have ArrayList that holds keys to be deleted.
ArrayList delteList = ...
foreach element in hashtable
if want to delete key
add key to deleteList
foreach key in deleteList
hashtable.delete(key)
|
|
|
|
|
Does anybody know how I could print a .Net Bitmap with Win32 Api calls? Thanks alot
|
|
|
|
|
Why would you want to? GDI+ (encapsulated in the System.Drawing classes) gives you all the functionality as GDI (though some things are still easier in GDI at times) and all the printing facilities in .NET allow you to manipulate the image that is printed (including text) however you want. It's a heck of a lot easier, especially since coordinate transformations are a little easier since the printer-specific coordinate mapping is abstracted away.
If you want to use Win32 printing APIs (which is really just GDI using the HDC of a printer), then find an example in C/C++ and go to all the work of P/Invoking what you need to do it in C#.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
The reason that I want to use API is because I am working on a project to print invoices. The .Net printing framework is to slow to keep up with the volume of invoices printed every night. So, my only other alternative is to print using the API. Thanks for your help.
|
|
|
|
|
By the time the performance hit for marshaling parameters for P/Invoked method invocation, you probably won't notice a huge difference anyway.
Perhaps a better solution is an N-tier design, one in which reports are generated and placed in a directory where another app (or even if the printer "driver" supports such a thing) is responsible only for printing the queued reports and removing them or backing them up. This would be truly faster so that your reporting app can just worry about generating these reports from the onslaught of all this data without having to wait for the printer queue to free-up after a few pages go in. A good multi-threaded design would help, but eventually you'd have to start blocking for sake of memory and performance.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
That wouldn't work because I only have a certain block of time that the reports can print because the printer is used for other purposes and with the .Net printing framework, it is constantly going behond that block. It is not the report generation that is slowing down the process, it is the actual printing of the reports. And actually, I am almost done with the Win32 Api printing functions and it seems to be considerably faster.
|
|
|
|
|
Yeah why don't you start getting undress and start f***ing the printer....
|
|
|
|
|
Why are you posting as Anonymous, you don't want anybody to know who you are?
|
|
|
|
|
I'm trying to code something that would act like Google's Deskbar.
Basically, I want an editbox in the Windows Taskbar, where I would type a work, and it would execute Encarta's Dictionary accordingly:
msdict -danythingtyped
What should I read about?!
Thanks.
Sammy
"A good friend, is like a good book: the inside is better than the cover..."
|
|
|
|
|
You would have to create a shell extension called a "Desk Band". See this MSDN article[^] for Microsoft's introduction to Explorer Bars, Tool Bands, and Desk Bands. There is also an article here[^] on CodeProject.
RageInTheMachine9532
|
|
|
|
|
I hope I can articulate this so that you can understand the problem. I built to classes: Encrypt and Decrypt according to MSDN article. When I run the program to encrypt and decrypt strings with the test program, everything works fine. The process is:
plaintext = "this is to be encrypted"
ciphertext = encrypt(plaintext)
returntext = decrypt(ciphertext)
in this example plaintext and returntext are identical.
I am trying to store the results of the encrypt to a registry string. ciphertext is a byte[] on the return so I am converting it to string for storage in the registry by using:
mystring = Convert.ToBase64String(cipherText)
in this example, ciphertext has a length of 48. I store mystring to the registry and retrieve it. This works fine. When I convert the plaintext from the registry back into a byte[] using:
cipherText = Encoding.ASCII.GetBytes(mystring);
the length is now 64 for ciphertext and the decrypt function fails returning an error message about PCKS7 padding is invalid.
How can I store the ciphertext to the registry and reconvert it back to byte[] without physically changing the data? Hope this makes sense. Thanks.
|
|
|
|
|
A good look at the documentation for the Convert and Encoding classes would be a good idea. You are mixing two incompatible methods, which just won't work. Convert.ToBase64String teams up with Convert.FromBase64String, and Encoding.GetBytes() teams up with Encoding.GetString(). Choose either pair and you should reach your goal.
John
"You said a whole sentence with no words in it, and I understood you!" -- my wife as she cries about slowly becoming a geek.
|
|
|
|
|
Thank you for responding, but I figured out exactly what you said after a few hours of pounding my head against the wall. Unfortunately, being new to c# is a head-ache and a half. It takes me 4 hours to do what I could do in 5 minutes with VFP. Thanks for the response.
|
|
|
|
|
I've got a webbrowser on my form i'm using for showing my current RSS feeds, problem is one of the sites i visit has javascript errors when it loads forcing the IE "do you want to run scripts..." error message to popup.
What do i need to set/override/do to stop these errors showing and destroying the flow of my tool?
Any ideas?
Thanks
|
|
|
|
|
Go into IE's Tools menu, Internet Options, click on Advanced tab, then uncheck 'Display a notification about every script error'.
RageInTheMachine9532
|
|
|
|
|
Thanks - i was trying to have this still turned on for users who like error messages to appear and do it in my program.
I think i have sussed it now by setting the "Silent" proeprty
on the browser object.
Thanks for your answer
|
|
|
|
|
I completely forgot about Silent! Thanks!
RageInTheMachine9532
|
|
|
|
|
Changing a user's preference is BAD idea without their acknowledgement or approval. You should make this an option in your software, or just rely upon their options already configured for IE (recommended). This is an ill practice and will be received as such.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I agree, really i just want javascript errors to not show on the one and only web browser in my application and leave the user settings alone. I can do this with popup windows by handling an event.
Is there an event i can handle that basically says "come here when a javascript error occurs" so i can then kill it off?
Setting the browser property "Silent" seems to work but i don't want to use this if it set globally all IE's to use this.
Thanks
|
|
|
|
|
Silent will tell the browser to show or not show dialog boxes. Critical errors and security alerts will still get shown, according to the docs on MSDN. Silent should NOT change the settings for all browser instances, just the one the Silent property was set to True on.
There is also no event fired when a script error occurs, at least on from the browser object. NavigateError will be fired if there is a server error returned, like 404 - Page not found, but it won't catch scripting errors.
RageInTheMachine9532
|
|
|
|
|
Off the top of my head, I'm not sure. If possible, this will definitely get into the advanced hosting interfaces, which you can read more about in the Advanced Hosting Reference[^] on MSDN. This uses a lot of COM interfaces to override and provide user interfaces for the WebBrowser control (or the MSHTML control, but that's too low-level and you have to implement much more that the WebBrowser provides for you).
To get these interfaces defined in a .NET assembly, there is a good trick that you can read about in the CodeProject article, Using MSHTML Advanced Hosting Interfaces[^], which also discusses how to use these to override behavior.
The MSDN link (and other articles in that parent section) cover a lot of functionality that may allow you to capture errors, but from what I've read and remember (since I've done a lot with hosting interfaces both in COM and .NET) I don't think you can. Good luck, though. It's at the very least a good learning experience to read through all that. Might even give you some ideas about additional functionality you may wish to provide to the WebBrowser control in your application.
Microsoft MVP, Visual C#
My Articles
|
|
|
|