|
thank you
solve my problem with this:
If (txtstart.text="OK")
{
do somthing
}
else if (txtstart.text="Stop")
{
application.close();
}
|
|
|
|
|
That's bogus.
|
|
|
|
|
I tried to find it, but Google today doesn't like and doesn't want to tell me this.
I have an enum:
[Flags]
enum EnumName
{
None = 0,
Value1 = 1,
Value2 = 1 << 1,
Value3 = 1 << 2,
Value4 = 1 << 3,
Values13 = Value1 | Value3,
Values24 = Value2 | Value4
}
How can I extract from this enum values that are "simple values"... I want to get collection, array, whatever, that will store values:
None
Value1
Value2
Value3
Value4
I have a couple of enums like this, so "just create a list of those values" isn't good. Also this list is a subject of changes, so I want it to be done automatically after compilation.
Don't forget to rate answer, that helped you. It will allow other people find their answers faster.
|
|
|
|
|
You should use the static Enum.GetValues method. It retrieves an array of the names of the constants in a specified enumeration. In your case:
var names = Enum.GetNames(typeof(EnumName));
If you need to get the names as well as their values, use Enum.GetValues .
I hope this helps.
2A
|
|
|
|
|
Yeah. I know this. But I want to filter out values that are combination of two or more other values in the enum. So when I have:
Value13 = Value1 | Value3
I want it to be filtered out.
Don't forget to rate answer, that helped you. It will allow other people find their answers faster.
|
|
|
|
|
In this particular case you need only values that evaluate to a power of 2, so you can do something like this:
List<EnumName> filtered = new List<EnumName>();
foreach (EnumName val in Enum.GetValues(typeof(EnumName)))
{
if ((val & (val - 1)) == 0)
filtered.Add(val);
}
Now filtered will hold all EnumName values except Value13 and Value24 (Which are not powers of 2).
2A
|
|
|
|
|
Great. Didn't thought of this. Thanks.
Don't forget to rate answer, that helped you. It will allow other people find their answers faster.
|
|
|
|
|
[ADDED] Half of this message is wrong, see the replies.[/ADDED]
FYI: the presence of Value13 and Value24 makes your usage of [Flags] inappropriate, see the "guidelines" in MSDN[^]. ]Flags] expects all values to be "bitwise non-overlapping" so if A and B are values, A|B should differ from A as well as from B, which your set does not satisfy. However the compiler does not check this. AFAIK the only implication is on how ToString() will operate.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
modified on Friday, May 20, 2011 8:03 AM
|
|
|
|
|
Maybe I'm to tired, but I don't see how does it brakes those guidelines. I have Value1 , Value2 , Value3 and Value4 as my enumeration values, and for "commonly used flag combinations" I have:
Value13 , that means Value1 OR Value3
and
Value24 , that means Value2 OR Value4
Value13 and Value24 mean "Value 1 or 3", "Value 2 or 4", not "Value 13", "Value 24". Obviously, this enum is just an example and in my real code it's more meaningful.
Don't forget to rate answer, that helped you. It will allow other people find their answers faster.
|
|
|
|
|
Sorry, you are right, I misunderstood what was written there. Having bit combinations defined in a [Flags] enum is perfectly valid (which explains why I never got a compiler message when I accidentally did what I thought was not allowed).
Here is an example of how [Flags] interacts with ToString():
enum Numbers {
Zero=0, One=1, Two=2, Three=3, Four=4, Five=5
}
[Flags]
enum Flags {
Zero=0, One=1, Two=2, Three=3, Four=4, Five=5
}
public override void Test(int arg) {
for (int i=0; i<8; i++) log("Numbers."+i+"="+(Numbers)i);
for (int i=0; i<8; i++) log("Flags."+i+"="+(Flags)i);
}
which yields:
13:53:36.826 CPTest.log-59 Numbers.0=Zero
13:53:36.835 CPTest.log-59 Numbers.1=One
13:53:36.846 CPTest.log-59 Numbers.2=Two
13:53:36.862 CPTest.log-59 Numbers.3=Three
13:53:36.874 CPTest.log-59 Numbers.4=Four
13:53:36.884 CPTest.log-59 Numbers.5=Five
13:53:36.896 CPTest.log-59 Numbers.6=6
13:53:36.906 CPTest.log-59 Numbers.7=7
13:53:36.915 CPTest.log-59 Flags.0=Zero
13:53:36.925 CPTest.log-59 Flags.1=One
13:53:36.934 CPTest.log-59 Flags.2=Two
13:53:36.943 CPTest.log-59 Flags.3=Three
13:53:36.951 CPTest.log-59 Flags.4=Four
13:53:36.960 CPTest.log-59 Flags.5=Five
13:53:36.968 CPTest.log-59 Flags.6=Two, Four
13:53:36.977 CPTest.log-59 Flags.7=Two, Five
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Good call
2A
|
|
|
|
|
Hi
I want help to import slides of ppt but from different veresion (2003,2007)
I think the reference change of microsoft I can add many reference to one program
or what to display any ppt form any version pleeeeese Help
Thanks
|
|
|
|
|
The object model changes between versions. Later versions should be able to import older versions though.
|
|
|
|
|
Coz some one not have new version and if instull our program not work there
|
|
|
|
|
Then you have a problem. Potentially you could solve this by having a series of importers, and then using Inversion of Control to load the appropriate one at runtime.
|
|
|
|
|
Hi,
I have this VB6 code to follow and I'm fairly new to C# but I manage to do most things with my COM object in C# that I used to in VB6, but I just can't get my hand around subscription in C# despite googling for days.
I'm trying to do something like this, but no luck.
------------C#---------------
void SubscribeToEvent()
{
g.OnServiceAccessPerformanceUpdate += new INetMonClientObjNotify_OnServiceAccessPerformanceUpdateEventHandler(g_OnServiceAccessPerformanceUpdate);
}
This is the code in VB6 that works...
------------VB6--------------
Private Sub SetServiceAccessSubscription(SiteID As String, IDList() As Long)
On Error Resume Next
Dim VariantIDList As Variant
VariantIDList = IDList
g_NetMonitor.SetServiceAccessSubscription SiteID, VariantIDList
If Err.Number = 0 Then
PrintLine ("Service Access subscription successfully set.")
Else
Err.Clear
PrintLine ("Failed to set Service Access subscription.")
End If
End Sub
-----------------------------
Anyone care to give me some ideas of how to subscribe to the COM object updates?
|
|
|
|
|
Assumming the SetServiceAccessSubscription sub has the same signiture as the INetMonClientObjNotify_OnServiceAccessPerformanceUpdateEventHandler delegate, the code should be more along the lines of:
g.OnServiceAccessPerformanceUpdate += new INetMonClientObjNotify_OnServiceAccessPerformanceUpdateEventHandler(SetServiceAccessSubscription);
Note the change in the ...OnServiceAccessPerformanceUpdateEventHandler parameter from g_OnServiceAccessPerformanceUpdate to SetServiceAccessSubscription.
Hope that helps
"You get that on the big jobs."
|
|
|
|
|
Thanks! Great, half way there...
What would the EventHandler sub look like?
|
|
|
|
|
Don't know but Visual Studio is normally smart enough to autocomplete the statement for you. if you enter
g.OnServiceAccessPerformanceUpdate += Intellisense should automatically display the correct delegate. Hit tab and Intellisense will enter a default name for the subroutine. Hit tab again and a stub with the correct parameters should be created. So normally after you have typed the += symbols, all you need to do is tab, tab.
Hope that makes (intelli) sense
"You get that on the big jobs."
|
|
|
|
|
Thanks but that was what I initially did, and that's when I got the code I've quoted in my first message.
Maybe there's some problem with the "Intelli"-part of Intellisense? Or it might be just me, but I never get an Event. It compiles ok, but still "no action" when subscribed, and this COM object does send a lot of updates...
|
|
|
|
|
Are you sure the COM component is calling the event? The two code snippets you provide are different in their approach to subscribing. Perhaps you need to call SetServiceAccessSubscription from C#, instead of just hooking onto the event?
COM interop can be a bit strange to use because many COM components do not quite work how a .Net person expects.
|
|
|
|
|
BobJanova wrote: Perhaps you need to call SetServiceAccessSubscription from C#, instead of just hooking onto the event?
I'm starting to think that myself. Just have to figure out Variants in C#.
Thanks!
|
|
|
|
|
I think you can use object , and then use is or GetType to work out what further to do with it.
|
|
|
|
|
So, I am currently writing some software for my job. I am using OLE DB to connect to a Microsoft Office Access 2007 database, where all the data is stored. I have no issues for the most part. However, I have a question concerning null field values when using OleDbDataReader.GetValue/String/Int/DateTime/etc.
Some fields in the database are required. This is no issue because I validate the necessary data in the software before attempting to insert/update records. But what about the fields that are not required by the database? Do I have to use "IsDBNull(ordinal)" for each field before I attempt a GetValue/String/Int/DateTime/etc. Or is there an easier way to go about "looking over" null values?
I have a class, RepairRecord, which stores the information about each record. And as an example, I have a field, Comments, which is not a required field. If I insert a record with no value for Comments all is well. That is, until I attempt to SELECT the record. If I simply use "reader.GetString(11)" and the value is empty I get an InvalidCastException, which I understand. I just need to know if there is a simpler method which I am looking past for dealing with these. The Comments field is not the only field that is optional.
If I am leaving out any important information just let me know.
Tools I am using:
Visual Studio 2010
C# (.NET 4.0)
OLE DB
|
|
|
|
|
For one thing, I never use the Getxxx methods -- they're as useless as the Convert class .
For another, don't use the ordinal values; use the names -- the order of things could change unexpectedly.
And, what do you do when it is null? Apply a default?
You may want something along the lines of:
System.DateTime somedate = System.DateTime.MinDate ;
if ( reader [ "somedate" ] != System.DBNull.Value )
{
somedate = (System.DateTime) reader [ "somedate" ] ;
}
(I don't feel like testing that right now, so I hope it works. Come on, beer, do your stuff!)
P.S. Oh, and I suppose you could write a generic Extension Method to simplify that for you.
|
|
|
|