|
The only place that IsNumeric exists, is for a char. The TryParse methods take a string, so if you have an object, you need this:
string testVal = myObject.ToString();
double d;
if (double.TryParse(testVal, out d))
{
// I used double because 23234.545 is a number and int.TryParse won't accept it
// I assume double.TryParse can parse a whole number.
}
The other way to do it is
bool isNumeric = true;
foreach(char c in myObject.ToString())
{
if (!char.IsNumber(c))
{
isNumeric = false;
break;
}
}
But this is more code, and again, it depends on if you care about decimals, writing a method to check decimals is even more messy ( you must accept one and only one decimal, and you need to respect culture, some cultures use , as a decimal point.
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
object obj = 10;
string str =Convert.ToString(obj);
Console.WriteLine(char.IsNumber(str, 0));
Console.Read();
Hi friend u can use this functionality and solve the issue.
Continue...
|
|
|
|
|
Wow - after two correct answers, you offer an incorrect one. Brilliant. This will work *sometimes*, but is far from foolproof.
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
Assume obj is some object .
To check if that is a number, you could use:
bool isNumber = Regex.IsMatch(obj.ToString(), @"^(\-|\+)?\d+[.]?\d*$");
SkyWalker
|
|
|
|
|
|
It depends on what you are actually doing.
Why would someone put that check inside a constant looping?
SkyWalker
|
|
|
|
|
Assuming you had something like:
int number = 5;
...
object obj = number;
or
object obj = 5;
Then you could just use:
if(obj.GetType() == typeof(Int32) {
}
or even simpler still:
if(obj is Int32)
You may also want to check for Int16 and Int64 (or you can check for short, int and long, oh yeah and there's also float and double to check for as well. And the unsigned versions of the types)
My current favourite word is: Nipple!
-SK Genius
|
|
|
|
|
Hi, i'm writing a program about copy files from one place to other place. When the copy process start, it will shows up a form and tells user what file are being copied and there is a button to allow the user to stop the process. My problem is i cannot make the "stop" button works.The program code is like this:
======Copy Form======
private void StopButton_Click(object sender, EventArgs e)
{
frmTest.Stopcopying = true;
return;
}
=======Main form(frmtest) ========================
....
public static bool Stopcopying = false;
...
public static void copyDirectory(string Src, string Dst) {
String[] Files;
fmCopying.StartPosition.Equals("Center");
if (Dst[Dst.Length - 1] != Path.DirectorySeparatorChar)
Dst += Path.DirectorySeparatorChar;
if (!Directory.Exists(Dst)) Directory.CreateDirectory(Dst);
Files = Directory.GetFileSystemEntries(Src);
// int[] result = Array.FindAll(Files, delegate(int i){}
frmCopying fmCopying1 = new frmCopying();
fmCopying1.Show();
foreach (string Element in Files)
{
fmCopying1.Refresh();
// Sub directories
if (Directory.Exists(Element)){
if (frmTest.Stopcopying == true)
{
fmCopying1.Close();
return;
}
copyDirectory(Element, Dst + Path.GetFileName(Element));
fmCopying1.Refresh();
fmCopying1.lblCopying.Text =Element;
fmCopying1.lblCopying2.Text = Dst + Path.GetFileName(Element);
fmCopying1.Refresh();
} // Files in directory
else
{
if (frmTest.Stopcopying == true)
{
fmCopying1.Close();
return;
}
File.Copy(Element, Dst + Path.GetFileName(Element), true);
fmCopying1.Refresh();
fmCopying1.lblCopying.Text =Element;
fmCopying1.lblCopying2.Text = Dst + Path.GetFileName(Element);
fmCopying1.Refresh();
}
}
fmCopying1.Close();
}
....
try
{
if (frmTest.Stopcopying == true) throw null;
copyDirectory(@path, @mapto);
} catch (Exception err)
{
{
string errrr = "Error: " + err.Message;
MessageBox.Show(this, errrr, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
|
|
|
|
|
If i click on the stop button the window will freeze and the copy process don't stop..
My though in the code maynot be the best way of doing it, any ideas are welcome, many thanks for your help
|
|
|
|
|
Hi,
if you call the copyDirectory method on the GUI thread (say inside a button click handler,
or a form load handler), then the GUI will be blocked as long as the copy takes, hence
the stop button will not work during that time, making it useless.
the right solution is to perform the copyDirectory on a separate thread, which gets
launched by the start button or the form load handlers, and which does not run on the
GUI thread, so you can move, resize, etc while the copy is going on; and you now can
use the stop button.
Warning: if you need to update the GUI (say show the filename currently being copied)
you would need Control.InvokeRequired and Control.Invoke to do so.
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|
|
many thanks, Luc. I am now rewriting the Copy form and add Thread method to it, so when it starts it will open a new thread and start the copy method. But i don't quite get how to get Control.InvokeRequired and Control.Invoke works, can you please give a bit example or a bit explainlation of them? many thanks again!
daniel
|
|
|
|
|
Use a delegate whenever you want to update controls created within other threads (i.e. to avoid cross-thread operations):
delegate void SomeActionCallback( Control yourControl, ... other params here ... );
void SomeAction( Control yourControl, ... other params here ... )
{
if (this.IsDisposed) return;
if (yourControl.IsDisposed) return;
if (yourControl.InvokeRequired)
{
SomeActionCallback deleg = new SomeActionCallback(SomeAction);
this.Invoke(deleg, new object[] { yourControl, ... pass other params here ... });
}
else
{
}
}
Call SomeAction() whenever you want to update the controls of your form from a thread event handler.
SkyWalker
|
|
|
|
|
|
Yeah, but the "cros thread operation" is still there
SkyWalker
|
|
|
|
|
hi i have come accross a problem that after the process completed i cannot start the copy process again once it have completed. It complains "The object have been disposed", My question is how can i check if the bw have been stoped and i can start another bw(oR create a new bw)?
I used the GUI to make the bw, it generates this
private BackgroundWorker bw;<br />
...<br />
<br />
this.bw = new System.ComponentModel.BackgroundWorker();<br />
...<br />
this.bw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bw_DoWork);<br />
this.bw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bw_RunWorkerCompleted);<br />
<br />
.....<br />
<br />
<br />
<br />
public static void copyDirectory(string Src, string Dst)
{<br />
String[] Files;<br />
<br />
<br />
fmCopying.StartPosition.Equals("Center");<br />
<br />
<br />
if (Dst[Dst.Length - 1] != Path.DirectorySeparatorChar)<br />
Dst += Path.DirectorySeparatorChar;<br />
if (!Directory.Exists(Dst)) Directory.CreateDirectory(Dst);<br />
Files = Directory.GetFileSystemEntries(Src);<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
foreach (string Element in Files)<br />
{<br />
<br />
fmCopying.Refresh();<br />
<br />
if (Directory.Exists(Element)){<br />
<br />
<br />
<br />
System.Threading.Thread.Sleep(1000);<br />
copyDirectory(Element, Dst + Path.GetFileName(Element));<br />
<br />
fmCopying.Refresh();<br />
fmCopying.lblCopying.Text =Element;<br />
fmCopying.lblCopying2.Text = Dst + Path.GetFileName(Element);<br />
fmCopying.Refresh();<br />
<br />
<br />
<br />
<br />
}
else<br />
{<br />
<br />
<br />
<br />
<br />
<br />
System.Threading.Thread.Sleep(1000); <br />
File.Copy(Element, Dst + Path.GetFileName(Element), true);<br />
fmCopying.Refresh();<br />
fmCopying.lblCopying.Text =Element;<br />
fmCopying.lblCopying2.Text = Dst + Path.GetFileName(Element);<br />
fmCopying.Refresh();<br />
<br />
<br />
}<br />
<br />
}<br />
<br />
<br />
fmCopying.Close();<br />
<br />
<br />
}<br />
<br />
.....<br />
<br />
private void bw_DoWork(object sender, DoWorkEventArgs e)<br />
try<br />
{<br />
<br />
<br />
<br />
<br />
<br />
<br />
copyDirectory(@path, @mapto);<br />
<br />
<br />
<br />
<br />
<br />
<br />
}<br />
catch (Exception err)<br />
{<br />
{<br />
<br />
string errrr = "Error: " + err.Message;<br />
MessageBox.Show(this, errrr, "", MessageBoxButtons.OK, MessageBoxIcon.Error);<br />
<br />
<br />
}<br />
}<br />
<br />
<br />
<br />
<br />
<br />
<br />
bw.WorkerSupportsCancellation = true;<br />
<br />
<br />
<br />
fmCopying.Show();<br />
<br />
<br />
bw.RunWorkerAsync();
* / */
|
|
|
|
|
You can find a lot of coding examples on the net.
This[^] is one of them.
SkyWalker
|
|
|
|
|
View a printable version of this message! I'm working on building a web-based solution (c# + .net) to allow users to
manage AD groups that they have appropriate rights to manage. On all groups
in Active Directory, there is an advanced permission called "Write Members".
If the user (who logged in via a forms based login page) is granted that
permission on the group (either directly or by being a member of a group that
has been granted the necessary permission), they should be able to update the
group membership. The web app has its own user account with enough
permissions to update the group, but I don't know the best way of having it
determine if it should use it's powers to update the membership for the user.
My question: What is the best way to handle this, and is there a way for me
to just pass the user DN (or SID, SAMAccountName, etc), and have AD determine
if it that user is allowed to access that object.
I've found code that should be able to get the user's security token, and
parse the SIDs it contains. I'm assuming I could then take that list of
SIDs, and compare it to the list of users/groups that have Write Members set
to allow on the group in question. This seems ugly/wrong. There are too
many cases where this falls short (i.e. the user is a member of a group that
doesn't have the Write Members permission, but it does have the Write All
Properties permission. It also doesn't effectively check for deny entries.)
It feels like there should be a way for me to simply [programatically] ask AD
if user X has access to update the "member" attribute on a given group.
I am a Systems Engineer and not (yet) a programmer, so a little more verbose
answer is very much appreciated.
Thanks!
|
|
|
|
|
perhaps using LDAP ? My program can allow AD users to change their password by their own.
I'm not sure does this works in your case. You can try.
|
|
|
|
|
Is it possible to put in a Domain an allready loaded Assembly?
The purpose of this project is to load a C# source file, compile it, put it in an AppDomain and execute a function in it...but I googled, searched in the "Object Browser" of VS2005...
Hope someone can help me!
Dan
|
|
|
|
|
Hi,
I'm not a specialist in this matter, but IMO it is not possible; this is how I see it:
- you load an assembly in an AppDomain;
- you can't assign (or move) a loaded assembly to an AppDomain;
- you can't load the same assembly twice;
- to unload an assembly, you have to delete the AppDomain that loaded it.
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|
|
I have a problem with HttpRequest.QueryString.
There is an XML string that contains something like the following: <age>8+
As you probably guessed, the "+" is the problem
I want to get that XML string from QueryString, however, the "+" appears as a " " (space), not a "+".
I have tried the following:
NameValueCollection coll = Request.QueryString;<br />
XMLstring = coll.Get("XMLstr");
XMLstring = Request.QueryString["XMLstr"]; // result: XMLstring = "<age>8 </age>"
XMLstring = Request.QueryString.Get("XMLstr"); // result: XMLstring = "<age>8 </age>"
XMLstring = HttpUtility.HtmlDecode(Request.QueryString["XMLstr"]); // result: XMLstring = "<age>8 </age>"
XMLstring = HttpUtility.HtmlDecode(Request.QueryString.Get("XMLstr")); // result: XMLstring = "<age>8 </age>"
In all of the above cases, XMLstring is a string (string XMLstring = ""; ).
I realise I can just search XMLstring and replace the space with the plus sign. I don't want to do that though. Also, this isn't my code, and I have no idea why XML is in QueryString nor if it should be there, never worked with asp or done web stuff in C#, but it has to stay like this for the moment, and I have to somehow extract that + sign.
Any help or advice is appreciated.
Thanks.
|
|
|
|
|
dfn wrote: never worked with asp or done web stuff in C#,
If this is C#, this is ASP.NET, not asp. And, we have a forum for ASP.NET questions.
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
You can't get the correct value if it's not encoded properly when put in the querystring.
This is how the querystring should look like to be correct:
?XMLstr=8%2b
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
I am currently updating old code that was not created by myself in hopes of fixing a minor security problem (I say minor as the configuration files that could be accessed would not give away much but we still want to cover them up). Currently files are being decrypted to a folder in the application data folder and deleted once the program ends, the problem is files may be left around if the program crashes.
My question is, is there a way to create a file (that can be pass to the unzip method as a String) that would be deleted as soon as the program exits or is terminated? The key is that I would like to pass the folder location in by a String to prevent having to update lots of code.
Thanks!
|
|
|
|
|
No. You could do one of three things:
1 - write a service that periodically checks the folder and checks if your app is running, if it's not, empties the folder
2 - delete the file sooner or find a way to deal with it in memory
3 - mark the folder as hidden, and hope that most users won't see it
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|