|
You want the same data to be displayed in each Form?
Live for today. Plan for tomorrow. Party tonight!
|
|
|
|
|
No,
I will try to be more clear now.
If I have, for example, 3 forms opened, the user can connect and receive data independently. The data tha is going to receive is different in time and size.
Form1: Opened and Connected. Receiving Data = data1 from t=0;
Form2: Opened and Connected. Receiving Data = data2 from t=1;
Form3: Opened and Connected. Receiving Data = data3 from t=2;
Once the three of them are receiving data, the 3 forms´ output windows must show the data that they are receiving, not syncronized between them and not the same data.
I hope it´s better to understand now.
Thanks,
D.
|
|
|
|
|
How does each form receive the data? Is it from the same source ? Is it the same class that processes the requests for data and then sends to the form or how does it happen? I think you should explain your application some more.
Live for today. Plan for tomorrow. Party tonight!
|
|
|
|
|
Hello Wayne,
I´ve just post some code in Bill´s answer,
I hope it´s enough information; otherwise please tell me and I´ll post more code and explanations.
Ty in advance,
regards,
D.
|
|
|
|
|
It is not clear from your explanation what the problem is. Can you elaborate?
V.
|
|
|
|
|
The main problem is that the API was not prepared for being used as multi-thread, and now if I connect and receive data in different forms, it shows all the data in the Output Window of the last Form that the user clicks on Receive Data
Thanks,
D.
|
|
|
|
|
I saw the post of Wayne and I agree.
You need to explain how data is received. Don't post ALL your code, just the bits that are necessary for explaining how this works.
V.
|
|
|
|
|
Hello V.
I´ve post a bit of code in the replay to Bill.
Hope this helps,
Regards,
D.
|
|
|
|
|
I'll join with the questions posed by Wayne and V: really need to know what 'entity' now receives the incoming data, and processes it.
Why isn't the incoming data 'separated out' in some way where it is clear what query it is a result of ?
This certainly sounds like a scenario where you would want multiple threads running.
best, Bill
"In the River of Delights, Panic has not failed me." Jorge Luis Borges
|
|
|
|
|
Well, sorry for the missed out information, I´ll try to post a bit of code now:
Here is the code for opening several forms (3 in this case). By now its just using a "for" loop, but it will be managed with an UI control for opening as many forms as the user needs:
static void Main()
{
FormsList = new List<frmPpal>();
Conn_control = new ConnectionController();
for (int i = 0; i < 3; i++)
{
frmPpal form = new frmPpal(new DayTradeFacade());
FormsList.Add(form);
form.Show();
}
Application.Run();
Now the code of the frmPPal.cs relative to Connect button and Subscribe button (Receive Data):
private void buttonReconnect_Click(object sender, EventArgs e)
{
if (!Connected)
{
ThreadPool.QueueUserWorkItem(delegate
{
DayTradeFacade.SetMessagesTextBox(textBoxMessages);
DayTradeFacade.SetTesting1TextBox(textBoxOutput1);
DayTradeFacade.SetTesting2TextBox(textBoxOutput2);
Facade.Account.AccountValueUpdated += UpdateListViewAccountValues;
Facade.Portfolio.PortfolioChanged += UpdateListViewPortfolio;
Facade.ConnectToTws();
}, null);
}
else
{
textBoxMessages.WriteLine("Already connected.");
}
}
And now Receive Data:
private void buttonSubscribeToPresetFutures_Click(object sender, EventArgs e)
{
if (!Connected)
{
textBoxMessages.WriteLine(NotConnectedErrorMessage);
return;
}
if (!FuturesTradingHours.NowIsInsideTradingHours())
{
textBoxMessages.WriteLine(
"Can only subscribe to futures between " + FuturesTradingHours.MarketOpenTime
+ " and " + FuturesTradingHours.FiveSecondPriceBarSubscriptionUnsubscribeTime + ".");
return;
}
textBoxOutput1.Clear();
Facade.SubscriptionManager.SubscribeToFiveSecondPriceBars(_presetFutures, TradingStrategyTypeToUse);
}
When a subscription is done, it receive data each 5 seconds, and it must be output in the proper textbox control.
what is done for a single form is:
...
DayTradeFacade.WriteLineToTesting1("Normal: " + openTime);
...
, and what I want is this called using the Form from where subscription was made
Hope this helps for helping me
Thank you,
D.
|
|
|
|
|
At first sight I would think that the Facade object is the same for all three forms.
V.
|
|
|
|
|
Yes, you are right.
But, I think it´s not relevant for setting the proper output window.
I mean, facade is just the class for events, but each event is triggered to the proper form.
I just need to focus in the proper form.
I´ve got a FormList, so for example what I´ve done is:
TTS_RealTime.FormsList[0].textBoxOutput1.WriteLine("Normal: " + openTime);
Just need to set FormList[index] to the form from where the subcription was made.
Any idea?
Ty,
D.
|
|
|
|
|
Maybe I misunderstood your code, but if the Facade object (the instance, not the class) is the same for each form it will receive the data of all three forms. If that's the case you need to :
- or initate a different instance for each form
- or find a way to find out who requested the information (maybe it is in the response) and dispatch the information to the correct form.
V.
|
|
|
|
|
V. wrote: - or find a way to find out who requested the information (maybe it is in the
response) and dispatch the information to the correct form.
That´s why I´ve post here, looking for some ideas to do this
But, each form has it´s facade, as I wrote in the Main() call:
frmPpal form = new frmPpal(new DayTradeFacade());
|
|
|
|
|
mmm, personally I would rethink your solution in giving the request/response responsibility towards the forms and let them handle it. (= solution 1)
In case you want solution 2, you need to find out if the component that responds actually supports this. Is there some sort of communication Id you need to provide when sending a request? If not, there is no way in telling for sure which response is for which request. If there is a request/response Id all you need is a dictionary linking your form with that Id.
1. Add Id/Form to dictionary when sending
2. On receive find form with key = Id.
3. Remove from dictionary.
If you don't have an Id, I'm not sure you can solve it via solution 2 unless you are sure the request/response sync is in order.
hope this helps.
V.
|
|
|
|
|
Thank you,
I will try first option.
Regards,
D.
|
|
|
|
|
I was wondering if you can point me to a reference for the following:
After the C#.net 2008 windows form (desktop) application obtains the windows user name and password, I want to pass this information to sql server 2008 r2 using windows authenication. Right now the connection string information is hard code in the app.conf file. How would you replace the code that is currenly in app.conf files?
|
|
|
|
|
Use notepad?
Well, you can always read the file[^], edit the value and write the value to the file[^].
Excuse me for my improper grammar and typos.
It's because English is my primary language, not my first language.
My first languages are C# and Java.
VB, ASP, JS, PHP and SQL are my second language.
Indonesian came as my third language.
My fourth language? I'm still creating it, I'll let you know when it's done!
|
|
|
|
|
|
dcof wrote: using windows authenication
Then why do you need to do anything?
dcof wrote: the connection string information is hard code in the app.conf file
Maybe stote it there with {0} and {1} so you can easily use String.Format to set the actual values?
|
|
|
|
|
You don't need to do anything with credentials. If you SQL Server is already setup to handle Windows Authentication, you don't need the credentials. You just need the correct connection string.
Trusted Connection:
Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;
Trusted Connection (Alternate syntax):
Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;
These, of course, assume that the user workstations are either in the same domain as the SQL Server or are in a domain that is trusted by the domain the SQL Server is in.
You don't need to modify the connection string at all.
You would also have to setup security in the SQL Server for the users or a group the users would be in to access the database accordingly.
|
|
|
|
|
can someone tell me why stack.takewhile does not pop the items taken?
Stack<int> mystack = new Stack<int>(Enumerable.Range(1, 5));
mystack.TakeWhile(i => i > 3).ToList().ForEach(i => Console.WriteLine(i));
Console.WriteLine(mystack.Peek());
outputs
5
4
5
i would expect the last peek to give me 3. ( obviously i'm missing something but what is it? )
|
|
|
|
|
Why would it? TakeWhile is a LINQ extension on Enumerable. It knows nothing about stacks.
|
|
|
|
|
|
I have created an array list to save my listview settings but cannot seem to figure out how to save it to an a preset setting in my properties. This is what I have so far.
List<string[]> list;
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
list = new List<string[]>();
foreach (ListViewItem lvi in lv.Items)
{
string[] values = new string[] { lvi.Text, lvi.SubItems[1].Text, lvi.SubItems[2].Text, lvi.SubItems[3].Text };
list.Add(values);
}
}
|
|
|
|