|
Is there a way to evaluate a string that contains code. I am wanting to store "Meta Data" in a database and then when the data is read out I want it to be evalulated before the result is rendered. For example lets say I have an onclick event stored in the database. The value of the onclick event is toggle('Car.Engine') where Car.Engine is an accessible object. How can I make the compiler eval the string before it puts the value in the toggle function?
|
|
|
|
|
The first thing you'd have to do is compile up the code, then load it and execute it. Funnily enough, I was reading an article[^] on something similar yesterday - it only does the first part, but that's the hard part.
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
So if I store 'String.Format("toggle('{0}');", controlID.ToString())' in the database in order to end up with a final string of say toggle('123456'); I need to create an assembly and then execute the assembly? How can you pass in an object to the executed assembly? In other words I need to pass in controlID so that I can get it's string value.
|
|
|
|
|
Hi.
how to show data in gridview and update and delete??
thanks in advance
jawad khatri.
|
|
|
|
|
|
Good Day
Before you post you must First Google. it is not a good way to learn , if you don't look for answers your self first. This is how its done
http://www.dotnetfunda.com/articles/article18.aspx[^]
Vuyiswa Maseko,
Few companies that installed computers to reduce the employment of clerks have realized their expectations.... They now need more and more expensive clerks even though they call them "Developers" or "Programmers."
C#/VB.NET/ASP.NET/SQL7/2000/2005/2008
http://www.vuyiswamaseko.somee.com
vuyiswa@its.co.za
http://www.itsabacus.co.za/itsabacus/
|
|
|
|
|
|
I don't know! But,I'll concert it .
|
|
|
|
|
I have already asked this question before (but was left unanswered), so I am attempting again, this time refining this question, and hoping that somebody that reads this, would be able to answer. The problem is this...
I have this application that sends data to another application on very short intervals (~250ms) between one write and another. This all works great on most PCs but on some others it doesn't work well at all. Reason being, that on the receiving-end, before being able to read all the bytes, the later parts of the data would become all 0s. I don't know if this is a timeout or what?
The current code is very simple but works fine (on most PCs):
nsStream.Write(buffer, 0, buffer.Length); // Buffer being a byte[] containing the data
nsStream.Read(buffer, 0, buffer.Length); // Buffer being a byte[] with a pre-determined size
I have attempted to encapsulate the NetworkStream within a BufferedStream but it only made the situation worse - it doesn't work on the PCs that it used to...
Any help is greatly appreciated!
|
|
|
|
|
So from two lines of code, each running on a different PC, someone should come up with a solution?
We would need:
- the entire code of the method that writes the data, and its context (which thread, how is it triggered, etc)
- the entire code of the method that reads the data, and its context
- the declaration and initialization of everything involved in the communication
- information on how both PCs are connected
- information on the data written each time: is it text? binary data? how much? what does it represent?
- at best an example of one data message
Your earlier code was terrible:
- you abused CanRead and CanWrite properties
- you had some kind of throttling with a while loop that could not possibly work reliably.
etc.
So, I suggest you be very much more specific, and you might get a decent answer.
Luc Pattyn [Forum Guidelines] [My Articles]
The quality and detail of your question reflects on the effectiveness of the help you are likely to get.
Show formatted code inside PRE tags, and give clear symptoms when describing a problem.
|
|
|
|
|
As requested, I will attempt to answer all the questions provided so that I may be provided with an answer which will solve this problem...
Luc Pattyn wrote: - information on how both PCs are connected
Physically the PCs are on a LAN, thus the network speed should be of no problem. There are multiple connections established in C#, all in TCP/IP. There are about three open ports on each side, each with a separate network stream for separate purposes. However, the exception only occurs in one of these.
Luc Pattyn wrote: - information on the data written each time: is it text? binary data? how much? what does it represent?
The data transferred in this particular NetworkStream is binary data representing a serialized Bitmap instance. Whilst the length of the serialized Bitmap instance varies every time, it is around ~710500 bytes long...
Luc Pattyn wrote: - the entire code of the method that writes the data, and its context (which thread, how is it triggered, etc)
The method called is Send(object) which looks as follows:
public bool Send(object oSend)
{
try
{
SendString(Serialize(oSend).Length.ToString());
return SendBytes(Serialize(oSend));
}
catch
{
return false;
}
}
Serialize is as follows:
public byte[] Serialize(object oSerialize)
{
if (oSerialize != null)
{
lock (serializeLock)
{
msMem = new MemoryStream();
bf = new BinaryFormatter();
try
{
bf.Serialize(msMem, oSerialize);
msMem.Flush();
msMem.Position = 0;
oSerialize = null;
bf = null;
return msMem.ToArray();
}
catch
{
return null;
}
}
}
else
return null;
}
SendString:
public bool SendString(string strSend)
{
try
{
SendBytes(new System.Text.ASCIIEncoding().GetBytes(strSend));
return true;
}
catch
{
return false;
}
}
and finally, SendBytes:
public bool SendBytes(byte[] bUp)
{
if (bUp != null && nsStream != null)
{
lock (sendLock)
{
try
{
if (nsStream.CanWrite)
nsStream.Write(bUp, 0, bUp.Length);
nsStream.Flush();
int x = 0;
while (nsStream.DataAvailable && x < dataReadWait)
{
x++;
}
return true;
}
catch
{
return false;
}
}
}
else
return false;
}
On the Receiving end,
Receive:
public object Receive()
{
return Deserialize(ReceiveBytes());
}
ReceiveBytes:
public byte[] ReceiveBytes()
{
bDown = new byte[8];
try
{
int bytesLength = Convert.ToInt32(ReceiveString(8));
bDown = new byte[bytesLength];
return ReceiveBytes(bytesLength);
}
catch
{
return null;
}
}
public byte[] ReceiveBytes(int length)
{
if (nsStream != null)
{
lock (receiveLock)
{
bDown = new byte[length];
try
{
if (nsStream.CanRead)
nsStream.Read(bDown, 0, bDown.Length);
nsStream.Flush();
return bDown;
}
catch
{
return null;
}
}
}
else
return null;
}
public object Deserialize(byte[] oDeserialize)
{
if (oDeserialize != null && oDeserialize.Length != 0)
{
lock (deserializeLock)
{
msMem = new MemoryStream(oDeserialize);
bf = new BinaryFormatter();
msMem.Position = 0;
try
{
obj = bf.Deserialize(msMem);
bf = null;
msMem = null;
return obj;
}
catch
{
msMem = null;
bf = null;
obj = null;
return null;
}
}
}
else
return null;
}
I am sorry for taking so much space for the code, but I have did as requested. I hope you can help me with this issue!
|
|
|
|
|
Hi,
if your code works sometimes, that would be a miracle.
here are some detailed comments:
1. SendString()
your try-catch converts an exception into a bool result, something I don't like since now you MUST check the return value every time you use SendString; as it normally will succeed, why not drop the try-catch and let it throw when there is a problem?
2. SendBytes()
2a. Stream.CanWrite is a constant, either it is always false and your app will fail, or it is always true. Testing it inside a loop doesn't make much sense.
2b. while (nsStream.DataAvailable) {...} is terrible code and the result depends on the speed of your PC, so it is completely unreliable.
this loop is wasting CPU cycles; why should a send method be interested in incoming data? and if there is a need, try to get it event-driven or use a separate thread and a Sleep inside the loop.
3. Send()
3a. Calling SendString and NOT checking the result???
3b. A try-catch that will never catch anything as the methods themselves have their own try-catch?
3c. you send two things (length and data), both in ASCII, without separator. How will the receiver now where the length ends and the data starts? Here is a major problem. What if the first databyte happens to be in the range [0x30,0x39] i.e. an ASCII digit?
3d. NEVER use catch{...} without parameter as it throws away all information about an exception that may be happening; the correct way to do this would be:
try {
....
} catch(AVerySpecificExceptionWeWantToReallyIgnore) {
} catch(Exception exc) {
log(exc.ToString());
...
}
where log(string) is some method to signal a mishap to the user and./or the log file.
4. Serialize()
4a. oSerialize = null; does not make sense, as oSerialize is a local variable in a method that is reaching its end.
4b. bf = null; does not make sense, as bf is a local variable in a method that is reaching its end.
4c. msMem.Flush(); doesn't do a thing.
4d. MemoryStream has a Dispose method, so you should call that when done to clean up things. Hence return msMem.ToArray() should be split in 3 lines.
5. ReceiveBytes()
5a. here you claim the length takes 8 characters; it does not. If you want it that way (good idea!) then make it so, e.g. SendString(Serialize(oSend).Length.ToString("D8")); in Send().
etc etc a lot of comments on sending also apply to your receiving code.
and some overall suggestions:
1. seems like you haven't really grasped the concept of Exceptions and try-catch, as you are trying to get rid of exceptions as soon as possible. I suggest you (re)read that chapter in your C# book.
2. I always suggest to improve observability by adding logging, with a log(string) method and possibly also a log(Exception) method, which log 1 or many lines to an appropriate output, such as a console window, a ListBox, or a text file (and possibly two of those); absolutely not to a MessageBox as you can only see 1 of them at a time.
public void log(string s) {
listbox1.Items.Add(s);
listbox1.TopIndex=listbox1.Items.Count-1;
File.AppendText(logfileName, s+Environment.NewLine);
}
3. read the MSDN documentation on the classes and methods you are using, including the remarks section. I know the examples are often absent or too simple, but the text that is present usually is relevant.
4. I wouldn't turn a memorystream into a byte array into a networkstream; the byte array is a detour, and maybe the serializer could write straight to the networkstream.
5. the communication code you have is extensive and unreliable; apply my suggestions, you will make it both shorter and better.
Luc Pattyn [Forum Guidelines] [My Articles]
The quality and detail of your question reflects on the effectiveness of the help you are likely to get.
Show formatted code inside PRE tags, and give clear symptoms when describing a problem.
|
|
|
|
|
This is just to inform you that I have just amended most code as you kindly suggested. With regards to exception handling, I must say that I have been a bit careless in implementing them, thus that is why they lack so much - sorry about that. Now I have now implemented two methods:
void Send(object obj) - which serializes the object immediately into a NetworkStream.
object Receive() - which deserializes from the NetworkStream into an object.
Obviously enough this should be much better both in terms of performance and simplicity of code.
I'm not sure that this would solve the problem of not being able to receive all the data (I don't expect it too anyway), and I'll keep you informed.
I would like to thank you once again, however, if you get an idea on how to ensure that all data is read, I kindly ask you to reply with that Thanks so much!
|
|
|
|
|
I expect new code to behave much better, as it improves performance (not needing a byte array) and fixes the length bug (8-digit length being generated now).
If there still are problems, describe them accurately, and provide new code if necessary.
Luc Pattyn [Forum Guidelines] [My Articles]
The quality and detail of your question reflects on the effectiveness of the help you are likely to get.
Show formatted code inside PRE tags, and give clear symptoms when describing a problem.
|
|
|
|
|
Guess what. It worked!
There are still a couple more things to work upon, but that was really starting to bug me! The way I saw it, I thought it had to do with timeouts or something, since the data was partially read, now I realize it's all in that class' miserable coding lol.
Thank you so much Luc! You're a life-saver
P.S. I wanted to add that post as a Good Answer but it's only appearing on the first post you made... Sorry about that haha.
|
|
|
|
|
You're welcome.
Luc Pattyn [Forum Guidelines] [My Articles]
The quality and detail of your question reflects on the effectiveness of the help you are likely to get.
Show formatted code inside PRE tags, and give clear symptoms when describing a problem.
|
|
|
|
|
Hey,
When I programed a new software in C# with Windows Form I got an "unsolved" problem that I hope you can help me with:
I written a form, when I resizing it the form get bigger but the controls still the same.
I wanted to know if there is a .NET built in command that can solve that probem? or i have to use the "Resize" event and set it myself?.
And if yes - when i get the Resize event, can i know what is the last size before the resize and now?
(like when i get the EventArgs e can i do someting like e.LastX or e.LastY)?
Thanks you very moch!, Yahav.
Gindi Bar Yahav - Web & Software developer.
|
|
|
|
|
You need to use proper anchoring and docking for the controls in the form.
It's not necessary to be so stupid, either, but people manage it. - Christian Graus, 2009 AD
|
|
|
|
|
You can use Control's .Anchor to dock the control according to the container size, though controlling how the controls resize is limited.
Or you can put the controls in a TableLayoutPanel or FlowLayoutPanel, you will have more control on how the controls react to resizing.
|
|
|
|
|
So there is no other way to "say" to C# - "I want that control (for example button) to resize automatic"?
Gindi Bar Yahav - Web & Software developer.
|
|
|
|
|
This is the way to that. Or handle the form's resize event and position and resize the controls accordingly.
It's not necessary to be so stupid, either, but people manage it. - Christian Graus, 2009 AD
|
|
|
|
|
That's what the Anchor or Dock properties for, for simple panel, tabpanel, or simple arrangement of buttons.
For more complex arrangement, you should use tablelayoutpanel
|
|
|
|
|
As the others have already answered. The controls aren't set to grow automatically... If that helps solving the problem, you can set the border to Fixed (so that it is not resized), however that doesn't solve the problem.
To actually solve the problem you can either handle the Resize event and grow the controls accordingly, but what would seem better (and easier) would be to click the controls in Designer mode and setting their Anchor to the most according manner. I have had no problems with this method so far.
With regards to the last part of your question, I believe that you can get to know the previous size by checking on the ResizeBegin event, and comparing with the ResizeEnd or Resize event. There might be easier solutions, it's just one that came to my mind at the moment.
Regards,
Trapper
|
|
|
|
|
Can I add more columns to resource file. Now it has only 3 columns and can i use it as a table. If it is possible please let me know how to do it.
Dushan Perera
|
|
|
|
|
Sounds like you need to add a database of some sort. No, you cannot do that.
Christian Graus
Driven to the arms of OSX by Vista.
Read my blog to find out how I've worked around bugs in Microsoft tools and frameworks.
|
|
|
|
|