|
return a struct that contains many bools, or pass some in as out parameters.
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.
|
|
|
|
|
bonzaiholding wrote: and i want the event to check more then one condition and will return if every thing is legal how can i do it ? (it's allways return the last result)
Hard to tell without seeing the code.
|
|
|
|
|
Where you're calling the delegate, instead of calling the delegate directly, iterate over the delegate's invocation list which you can get by calling it's GetInvocationList() method which will give you an array of instances your delegate, one for each call to be made. Check the result of each during the iteration and break out on the first false.
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Thanks, I just did it but there isn't some other easy way ?
|
|
|
|
|
Not really. This is the way delegates work - each delegate in the invocation list is called in the order they were added. If the delegate is altering or returning a value, the last one in the list could potentially override all the previous ones.
A good example of this is the FormClosingEventArgs. It's derived from CancelEventArgs which has the boolean Cancel property. If you have say two subscribers and the first one sets Cancel to true to stop the form closing, the second one can set it to false and the form will still close!
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
You could pass a parameter and check that in each handler:
using System;
using System.Windows.Forms;
public partial class Form1 : Form
{
TestClass testClass;
public Form1()
{
InitializeComponent();
testClass = new TestClass();
testClass.TestEvent += new EventHandler<TestEventArgs>(testClass_TestEvent);
testClass.TestEvent += new EventHandler<TestEventArgs>(testClass_TestEvent);
Shown += new EventHandler(Form1_Shown);
}
void Form1_Shown(object sender, EventArgs e)
{
testClass.PerformTest();
}
void testClass_TestEvent(object sender, TestEventArgs e)
{
if (e.TestBool != true)
{
e.TestBool = true;
MessageBox.Show("Changed to true");
}
else
{
MessageBox.Show("Already true");
}
}
}
public class TestClass
{
public event EventHandler<TestEventArgs> TestEvent;
protected virtual void OnTestEvent(TestEventArgs e)
{
EventHandler<TestEventArgs> eh = TestEvent;
if (eh != null)
eh(this, e);
}
public void PerformTest()
{
OnTestEvent(new TestEventArgs());
}
}
public class TestEventArgs : EventArgs
{
public bool TestBool
{
get;
set;
}
}
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Thanks Dave
|
|
|
|
|
Hello everyone,
i'm trying to store the rows from a datagridview under the name property of a button.
there for i use the following code:
private void button1_Click(object sender, EventArgs e)
{
Button wacht = new Button();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
wacht.Name += row.ToString() + System.Convert.ToChar(127);
}
wacht.Text = flowLayoutPanel1.Controls.Count.ToString();
wacht.Width = 75;
wacht.Height = 63;
wacht.Click += new EventHandler(wacht_Click);
flowLayoutPanel2.Controls.Add(wacht);
dataGridView1.Rows.Clear();
}
void wacht_Click(object sender, EventArgs e)
{
Button currentButton = sender as Button;
string[] lists = currentButton.Name.Split(System.Convert.ToChar(127));
foreach (string s1 in lists)
{
if (s1.Trim().Length > 0)
{
dataGridView1.Rows.Add(s1);
}
}
flowLayoutPanel2.Controls.Remove(currentButton);
}
but the code above doesn't work because there are no value's in the row cells.
first i wanted to use the listbox control to do this:
private void button3_Click(object sender, EventArgs e)
{
Button wacht = new Button();
wacht.Text = flowLayoutPanel1.Controls.Count.ToString();
foreach (object o1 in listBox1.Items)
wacht.Name += o1.ToString() + System.Convert.ToChar(127);
wacht.Width = 68;
wacht.Height = 54;
wacht.BackColor = System.Drawing.Color.LightYellow;
wacht.Click += new EventHandler(wacht_Click);
flowLayoutPanel1.Controls.Add(wacht);
listBox1.Items.Clear();
}
private void wacht_Click(object sender, EventArgs e)
{
Button currentButton = (Button)sender;
string[] lists = currentButton.Name.Split(System.Convert.ToChar(127));
foreach (string s1 in lists)
if (s1.Trim().Length > 0)
listBox1.Items.Add(s1);
flowLayoutPanel1.Controls.Remove(currentButton);
}
}
the code above works for the listbox but how to convert it so it is useable for the datagridview control?
maybe its a bit confusing but i hope someone could help me out!
modified on Thursday, August 20, 2009 6:24 AM
|
|
|
|
|
A couple of things:
1) Don't use the Name property for something like this, it is not a good practice. Use the Tag property instead.
2) In your wacht_Click handler, do not just cast the sender as a button - it is again bad practice - in future you may re-use the routine for a different control. Use:
{
Button currentButton = sender as Button;
if (currentButton != null)
{
...
}
}
3) There is no direct overload for DataGridView.Rows.Add that takes a string: you are using the generic Add(params object[]) instead - I do not know what it does with just a single string.
4) Why are you faffing about with strings and splits? You already have the DataGridViewRow items you want, why not keep a List<DataGridViewRow> in the Button.Tag property instead? You can then traverse and Add these directly, or extract the strings for your ListBox if you need to.
No trees were harmed in the sending of this message; however, a significant number of electrons were slightly inconvenienced.
This message is made of fully recyclable Zeros and Ones
|
|
|
|
|
Thanks for your great help! im now doing this:
Button wacht = new Button();
List<DataGridViewRow> list = new List<DataGridViewRow>();
foreach (DataGridViewRow dr in dataGridView1.Rows)
{
list.Add(dr);
}
wacht.Tag = list;
wacht.Text = flowLayoutPanel1.Controls.Count.ToString();
wacht.Width = 75;
wacht.Height = 63;
wacht.Click += new EventHandler(wacht_Click);
flowLayoutPanel2.Controls.Add(wacht);
dataGridView1.Rows.Clear();
but it still doesn't work, is this the way to do it?
|
|
|
|
|
Sorry about the delay - I never did get the hang of Thursdays - what isn't working? Are you getting a compiler error, a runtime exception, or what?
No trees were harmed in the sending of this message; however, a significant number of electrons were slightly inconvenienced.
This message is made of fully recyclable Zeros and Ones
|
|
|
|
|
no problem;)
I don't get compiler errors or exceptions,
but when i click the "currentButton" there is one row added with this text: System.Collections.Generic.List`1[System.Windows.Forms.DataGridViewRow]
Thanks for help!
|
|
|
|
|
Try comparing your code to this: I know it works, I just tried it!
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Testy
{
public partial class frmTest : Form
{
public frmTest()
{
InitializeComponent();
}
private void butFillIt_Click(object sender, EventArgs e)
{
try
{
if (dgvDisplay.ColumnCount == 0)
{
string[] strNames = { "MyColumn", "More", "3", "4", "5", "6" };
int iBase = 1;
foreach (string s in strNames)
{
dgvDisplay.Columns.Add("Base" + iBase, strNames[iBase - 1]);
iBase++;
}
}
string[] sa = { "Hello", "there", "this", "is", "a", "test" };
for (int i = 0; i < 5; i++)
{
sa[0] = "Hello " + i;
dgvDisplay.Rows.Add(sa);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void butDoIt_Click(object sender, EventArgs e)
{
try
{
List<DataGridViewRow> list = new List<DataGridViewRow>();
foreach (DataGridViewRow dr in dgvDisplay.Rows)
{
if ((dr.Cells.Count > 0) && (dr.Cells[0].Value != null))
{
list.Add(dr);
}
}
butUndoIt.Tag = list;
dgvDisplay.Rows.Clear();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void butUndoIt_Click(object sender, EventArgs e)
{
try
{
Button currentButton = sender as Button;
List<DataGridViewRow> list = currentButton.Tag as List<DataGridViewRow>;
if (list != null)
{
foreach (DataGridViewRow dgvr in list)
{
dgvDisplay.Rows.Add(dgvr);
}
currentButton.Tag = null;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
No trees were harmed in the sending of this message; however, a significant number of electrons were slightly inconvenienced.
This message is made of fully recyclable Zeros and Ones
|
|
|
|
|
Works GREAT Thank YOU very much! u made my day
|
|
|
|
|
<Hi all,
i have the following generic classes that allow me to build up a command list. But I am struggling with the implementation of the IEnumerable GetEnumerator . I do not know how to implement it so that it returns the results?
Here is my code:
class Command<K, T>
{
public K Key;
public T Item;
public Command<K, T> NextCmd;
public Command()
{
Key = default(K);
Item = default(T);
NextCmd = null;
}
public Command(K key, T item, Command<K, T> nextNode)
{
Key = key;
Item = item;
NextCmd = nextNode;
}
}
public class ServerCommand<K, T> : IEnumerable<T> where K : IComparable<K>
{
private Command<K, T> tempCmd;
private T Find(K commandKey)
{
Command<K, T> current = this.tempCmd.NextCmd;
while (current.NextCmd != null)
{
if (current.Key.CompareTo(commandKey) == 0)
break;
else
current = current.NextCmd;
}
return current.Item;
}
public T this[K commandKey]
{
get { return this.Find(commandKey); }
}
public ServerCommand()
{
tempCmd = new Command<K, T>();
}
public void AddCommand(K commandKey, T commandItem)
{
Command<K, T> newCmd = new Command<K, T>(commandKey, commandItem, this.tempCmd.NextCmd);
this.tempCmd.NextCmd = newCmd;
}
public IEnumerator<T> GetEnumerator()
{
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Many thanks in advance.
Kind regards,
The only programmers that are better C# programmers, are those who look like this -> |
Programm3r
My Blog: ^_^
|
|
|
|
|
You want to iterate all the child nodes starting from tempCmd right?
public IEnumerator<T> GetEnumerator()
{
Command<K, T> command = this.tempCmd;
do{
yield return command.Item;
command = command.NextCmd;
}
while(command != null);
}
|
|
|
|
|
Thanks!!
The only programmers that are better C# programmers, are those who look like this -> |
Programm3r
My Blog: ^_^
|
|
|
|
|
You're going to have to write a class that implements IEnumerator<T>. Then just return an instance of that class. It would just be a small class that captures some state: the first node ( for Reset ) and the current node ( for Current & MoveNext ).
Or you can write an iterator with the yield keyword, which basically gets the compiler to write the class for you.
Nick
----------------------------------
Be excellent to each other
|
|
|
|
|
Thanks for the response and the info Nick.
Kind regards,
The only programmers that are better C# programmers, are those who look like this -> |
Programm3r
My Blog: ^_^
|
|
|
|
|
Hallo!
What is the problem?
I have the Server and Client form here http://board.gulli.com/thread/141481...t-fhig-machen/[^]
So it works the fully code, i can open Word,Ecxel and shutdown in x sec.
f (get == "rWord")<br />
System.Diagnostics.Process.Start("winword");<br />
if (get == "rExcel")<br />
System.Diagnostics.Process.Start("excel");<br />
string[] get_Split = get.Split('~');<br />
int time = Convert.ToInt32(get_Split[1]);<br />
if (get.Contains("rshutdown"))<br />
{<br />
System.Diagnostics.Process.Start("shutdown", "-s -t " + time.ToString());<br />
}<br />
}
And so it do nothing!
string[] get_Split = get.Split('~');<br />
int time = Convert.ToInt32(get_Split[1]);<br />
if (get.Contains("rshutdown"))<br />
{<br />
System.Diagnostics.Process.Start("shutdown", "-s -t " + time.ToString());<br />
}<br />
}<br />
if (get == "rWord")<br />
System.Diagnostics.Process.Start("winword");<br />
if (get == "rExcel")<br />
System.Diagnostics.Process.Start("excel");
|
|
|
|
|
|
OK Sorry
The first code i have posted works!
And the Second is the same but the Array is in the end!This code doesn´t work!
|
|
|
|
|
are you getting any error... because in your sample the first method and the second method both are same... the only difference is the ifstatement goes last and the arrar comes first...
|
|
|
|
|
you getting a compiler error? or runtime?
what about the second '}'? is that in the wrong place? hard to tell without the opening code
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
Do you have an example value for "get" ?
Also System.Diagnostics.Process.Start("shutdown", "-s -t " + time.ToString()); will shut the machine down if called, not Word or Excel.
|
|
|
|