|
never mind I used an unbound list ^_^ thanks for your time though.
|
|
|
|
|
My problem seems to be simple, therefore I could not find an answer yet.
I have a windows forms application and the reports are being deployed and uploaded to a binary field in the database. The main idea is to run a query and retrieve this data, storing the report on a byte array. I don't want to compile reports inside the project nor reading them from the hard disk.
Is it possible to set the reportsource for the crystalreport viewer using this byte array or I REALLY have to define a file path on the hard disk? Actually, reading on a buffer, write the file on the disk and read it doesn't seem to be that clever... It'd be nice if we could just read the byte stream of the report template and directly set it as the report source.
Thanks in advance!
(C# / WindowsForms / Sql Server 2008)
|
|
|
|
|
Hi,
I've Built a chat and now i'me trying to a a function that prevent
same user to login.
The problem is when i'm blocking/disconnecting the user that login as same,
i'me also disconnectin the user that already connectec to the chat.
Some have an idea how to do it?
Tanks...
modified on Sunday, August 2, 2009 12:56 PM
|
|
|
|
|
I can suggest you to use Database for that. Create a field in DB Table as ISOnline of type bit . Set it True if user logged in.
Now, Whenever user logged in, I guess you are authenticate the use with Database, So during authentication also check the ISOnline Field . If its True, Throw Error Message. Else, Set the field as true and allow user to logged in.
Set ISOnline Field as False, when he logoff
Hope this will help you
|
|
|
|
|
And what if I logon, then my PC crashes, I reboot, I want to logon again? what will make sure IsOnline gets reset?
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.
|
|
|
|
|
One can send a "challenge" every n-seconds or so, verifying whether the client is still there. That would be what Windows Messenger does. When the client doesn't respond to the challenge-request, he/she is considered disconnected
That's a form of polling though, and polling is bad.
I'm as confused as a baby in a topless bar
|
|
|
|
|
Eddy Vluggen wrote: polling is bad.
I don't agree. Polling is mostly bad when used as a primary means for solving a synchronization problem; however IMO it is fine for low-frequency checks and problem recovery like the one you suggested. That's somewhat similar to Exceptions.
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.
|
|
|
|
|
plus add a LastActivity column too and keep update at a specified timer
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKQUFK[M`UKs*$GwU#QDXBER@CBN%
R0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
-----------------------------------------------
128 bit encrypted signature, crack if you can
|
|
|
|
|
Senario is like this;
I have a wcf service, this service sum two number. So "sum" class run on the server side. Client use following code;
Sum sum = Sum.Instance;
sum.AddParameter(1);
sum.AddParameter(2);
int result = sum.Calculate();
This service is run corectly when if at the same time ten client call this service and add different parameter? My main question is singleton pattern using is it wrong in this senario? Because all client use same instance.
|
|
|
|
|
I would have written this as sum.Calculate(params) that way you don't have to worry about other clients calling AddParameter, or even the same code adding more parameters then necessary and causing errors.
only two letters away from being an asset
|
|
|
|
|
Ok, I know if I send parameter in Calculate() function its work. What about the example I have given. How does it work in singleton?
Thanks...
|
|
|
|
|
Hi,
Here's what my table looks like..
ID Parent Name
------------------------
0 0 BaseLine
1 0 A
2 1 A1
3 1 A2
4 0 B
5 4 B1
6 4 B2
How would you load it recursively so it would show A1 & A2 under A and B1 & B2 under B and any deeper sub levels would show in the right node level.. I know it's supposed to be a simple recursion logic but it's getting me tired
|
|
|
|
|
|
Hmmm... Looks promising but how would you apply it in C#?? The logic itself is a mess and I cant just rewrite it in my application.. Any idea??
|
|
|
|
|
Here's the method I use:
public static void AddBranch(TreeNodeCollection nc, string Path, string Description, object o)
{
string[] paths = Path.Split('\\', '/');
TreeNode node;
foreach (string s in paths)
{
if (s == null || s == "")
{
continue;
}
if ((node = FindBranch(nc, s)) == null)
{
node = new TreeNode();
node.Name = Description;
node.Text = s;
node.Tag = o;
nc.Add(node);
}
nc = node.Nodes;
}
}
public static TreeNode FindBranch(TreeNodeCollection nc, string name)
{
if ((name != null) && (name != ""))
{
foreach (TreeNode n in nc)
{
if (n.Text == name)
{
return n;
}
}
}
return null;
}
Comments make it pretty obvious how to use.
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
|
|
|
|
|
Great, but how am I supposed to generate the path string?? Can you kindly tell me how would you populate my table's data into your tree??
This's how I'm loading the frist two levels to my tree:
private DataTable GenDT(string strSelect)
{
if (con.State != ConnectionState.Open)
con.Open();
DataTable _dt = new DataTable();
try
{
new OracleDataAdapter(strSelect, con).Fill(_dt);
}
catch (Exception) { }
return _dt;
}
private void LoadBudgetLineItems()
{
DataTable dt = GenDT(@"SELECT CODE, NAME, PARENT FROM BUDGETLINES ORDER BY CODE");
int L1,L2;
L1 = L2 = -1;
TreeGridNode node = new TreeGridNode();
foreach (DataRow dr in dt.Rows)
{
if (dr["PARENT"].ToString().Length == 0)
{
node = treeGridView1.Nodes.Add(null, dr["CODE"], dr["NAME"], "");
node.ImageIndex = 0;
node.DefaultCellStyle.Font = boldFont;
node.DefaultCellStyle.BackColor = Color.Black;
node.DefaultCellStyle.ForeColor = Color.White;
L1++;
foreach (DataRow dr2 in dt.Rows)
{
if (dr2["PARENT"].ToString().Equals(dr["CODE"].ToString()))
{
node = treeGridView1.Nodes[L1].Nodes.Add(null, dr2["CODE"], dr2["NAME"], "");
node.ImageIndex = 1;
}
}
}
}
}
Many thanks mate!
|
|
|
|
|
That's not nice! Are you really stuck with that data structure? The reason I ask is that it assumes so many things:
That the Parent ID exists.
That the Parent ID is less than the Code ID.
That the parent ID is not the going to go recursive.
It would not take a lot of user mistakes to bomb the data structure - you are going to need some very good error checking to avoid looping or loosing data.
Honestly? I would change the data and / or process it twice, first pass to assure integrity, second pass to populate.
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
|
|
|
|
|
You see, this's exactly why I didnt want to post my code at the first place
Ok, ignore the bullshit I'm running and tell me how would you manage it at both ends (Database structure and when it comes to populating the treeView control).. Please, I really need you to shed some light on my messy logic!
|
|
|
|
|
Sounds like a good question. As a first step, let us create a class named Node which will have Id and Name as properties, AddChild and FindNode as methods. Consider the following code,
public sealed class Node
{
readonly List<Node> childNodes = new List<Node>();
Node parent = null;
public Node(int id, string name)
{
this.Id = id;
this.Name = name;
}
public void AddChild(Node node)
{
node.SetParent(this);
childNodes.Add(node);
}
public void SetParent(Node parent)
{
this.parent = parent;
}
public Node FindNode(int id)
{
Node result = childNodes.SingleOrDefault(node => node.Id == id);
if (result == null)
{
foreach (Node node in childNodes)
result = node.FindNode(id);
}
return result;
}
public void PrintTree(Action<Node> callback)
{
callback(this);
foreach (Node node in childNodes)
node.PrintTree(callback);
}
public override string ToString()
{
return string.Format("Id : {0}, Parent Name : {1}, Name : {2}",
Id, parent == null ? "No parent" : parent.Name, Name);
}
public int Id { get; private set; }
public string Name { get; private set; }
} You have done with a recursive tree implementation!
If you are confused, here is the explanation.
1 - Each node holds its children nodes
2 - When a child node is added to a node, it will set the child nodes parent and add it to the children collection.
3 - FindNode() does a recursive search in all its children and tries to find a node with the specified id. If it can't find a node, returns NULL .
4 - PrintTree does a recursive search and ask each node and its children to print itself. The callback supplied will be called and you can handle this callback and do something useful. In this example, I have just printed the name.
Here is how you use it in a console application,
Node baseLine = new Node(0, "BaseLine");
baseLine.AddChild(new Node(1, "A"));
Node aNode = baseLine.FindNode(1);
aNode.AddChild(new Node(2, "A1"));
aNode.AddChild(new Node(3, "A2"));
baseLine.AddChild(new Node(4, "B"));
Node bNode = baseLine.FindNode(4);
bNode.AddChild(new Node(5, "B1"));
bNode.AddChild(new Node(6, "B2"));
baseLine.PrintTree(node => Console.WriteLine(node));
Console.ReadKey(); I wrote a blog post that explains the thought process in writing recursive methods. Read it here[^].
Hope that helps
|
|
|
|
|
Thank you Navaneeth! You're definitely one of the most helpful C# references..
I like your way of wrapping it in a class, the truth is, I'm a bit slow this week and would be greatly thankful if you can show me how would you load it from a dataset to a treeview control.. You know, in an iteration loop like for or foreach..
Here's a reminder of the relevant table structure...
ID Parent Name
------------------------
0 0 BaseLine
1 0 A
2 1 A1
3 1 A2
4 0 B
5 4 B1
6 4 B2
Thanks again mate.. I really appreciate the time you've spent to help me out and hope you soon become a MS MVP as well!
|
|
|
|
|
Here you go
bool firstIteration = true;
Node baseLine = null;
foreach (DataRow row in dt.Rows)
{
if (firstIteration)
{
baseLine = new Node(int.Parse(row["Id"].ToString()),
row["Name"].ToString());
firstIteration = false;
}
else
{
int parentId = int.Parse(row["Parent"].ToString());
Node parent = (baseLine.Id == parentId) ? baseLine : baseLine.FindNode(parentId);
parent.AddChild(new Node(int.Parse(row["Id"].ToString()),
row["Name"].ToString()));
}
}
baseLine.PrintTree(node => Console.WriteLine(node));
Console.ReadKey(); I'd suggest to avoid using DataTable in production code. You could achieve the above with a simple DataReader . DataTable uses reader internally. You may also need to add some sanity check to this code like NULL checking, data validation etc.
|
|
|
|
|
Thank you thank you thank you Navaneeth for having such a temper with me but I still dont get what your PrintTree is for I just want to fill a treeView control on a windows form
|
|
|
|
|
Muammar© wrote: but I still dont get what your PrintTree is for
Its the recursive method. It prints itself and asks children to do so. Each children will repeat this step until there is no children.
Muammar© wrote: I just want to fill a treeView control on a windows form
Well, you could have said this before. Fortunately, our node implementation is pretty well extensible. So here it goes.
You need to add the below property to Node class. This property returns parent node of a node.
public Node Parent { get { return parent; } }
Since our Node class and TreeView 's TreeNode class has different interfaces, we need a builder class that can convert Node instance into equivalent TreeNode . Name it TreeNodeBuilder .
public sealed class TreeNodeBuilder
{
Node root = null;
Dictionary<int, TreeNode> treeNodes = new Dictionary<int, TreeNode>();
public TreeNodeBuilder(Node root)
{
this.root = root;
}
public TreeNode BuildTreeNode()
{
TreeNode rootTreeNode = null;
root.PrintTree(delegate(Node node)
{
if (node.Parent == null)
{
rootTreeNode = new TreeNode(node.Name);
rootTreeNode.Tag = node;
treeNodes.Add(node.Id, rootTreeNode);
}
else
{
if (treeNodes.ContainsKey(node.Parent.Id))
{
TreeNode parent = treeNodes[node.Parent.Id];
TreeNode current = parent.Nodes.Add(node.Name);
current.Tag = node;
treeNodes.Add(node.Id, current);
}
}
});
return rootTreeNode;
}
} All you need to do is to supply your root node (baseline) to this class and call BuildTreeNode() . Here is how you do that,
TreeNodeBuilder nodeBuilder = new TreeNodeBuilder(baseLine);
treeView1.Nodes.Add(nodeBuilder.BuildTreeNode()); Run it and you are done!
|
|
|
|
|
Ok, sorry just saw your post, glad you're still up .. Just give me a minute to try it out.. please dont go anywhere stay with me for a couple of minutes
|
|
|
|
|
N a v a n e e t h wrote: // Code to create node in a loop. Same in the last post
TreeNodeBuilder nodeBuilder = new TreeNodeBuilder(baseLine); // baseline will be root node
treeView1.Nodes.Add(nodeBuilder.BuildTreeNode());
Ok, I told you I feel like a big idiot tonight so please tell me why am I getting only my root node when I write this:
Node baseLine = new Node(0, "BaseLine");
TreeNodeBuilder nodeBuilder = new TreeNodeBuilder(baseLine);
treeView1.Nodes.Add(nodeBuilder.BuildTreeNode());
I have to do some kind of iteration right?? Please show me mate.. I cant thank you enough Naveneeth, you're my hero now
ps. Dont worry, I'm not gay
|
|
|
|