|
You would be better off customizing this without reimplementing from scratch. I have done this in a C# project of mine and it works well. It does involve some extensive interop. Here is a link to an article about customizing this dialog. It is written in C++ but you can also do this with interop.
http://www.codeproject.com/dialog/customize_dialog.asp[^]
I hope this helps you get started.
Deus caritas est
|
|
|
|
|
Hello,
I am trying to let my main thread insert some records in a SQL database and a background worker will keep on scanning the SQL and read a record, do some work based on that record and after that, the background worker will delete that record and scan for new record. Now My question is, should I have to go thru any lock mechanism or (Although I am not familiar with lock mechanism) this process will workout without any conflict. !!
-- modified at 4:24 Wednesday 22nd February, 2006
|
|
|
|
|
No, you shouldn't have to do any synchronization with the lock keyword. You would use lock if two threads or processes were accessing shared memory; in your case, however, no shared memory exists. You use the database as a one-way buffer for the information, if I interpret your description correctly.
Now, if the database did not have ACID[^] compliance, then you'd have a problem.
"we must lose precision to make significant statements about complex systems."
-deKorvin on uncertainty
|
|
|
|
|
Hello,
I have seen that Background worker has an event handler for Progress Changed, but I found that, I will have to write code in DoWork method to report progress. But many method is a very time consuming method where i dont know the progress ( example : Sending email ), how can I make Background wroker determine the progress of its work ? Is it not possible ?
Thanks
Emran
|
|
|
|
|
Hi Emran,
The following gets the progress on interating thru Controls on a form....Something like :
private int progressBarIndex;
private void StartWorker()
{
//Set progress Bar stuff before running thread
this.myBar.Value = 0;
this.myBar.Minimum = 0;
this.myBar.Maximum = 100;
//Set the thread going
this.worker.WorkerReportsProgress = true;
this.worker.RunWorkerAsync(this.Controls.Count);
}
private void LoopThruControls()
{
foreach (Control control in this.Controls)
{
Console.WriteLine(control.Name.ToString());
//Update progress
this.workerReportProgress();
}
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//Call this method when thread begins
this.LoopThruControls();
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Update the progress bar
System.Diagnostics.Debug.Assert(InvokeRequired == false);
this.myBar.Value = e.ProgressPercentage;
}
private void workerReportProgress()
{
this.progressBarIndex++;
this.worker.ReportProgress(progressBarIndex);
}
.. then use worker_RunWorkerCompleted to Finish..
HTH
Jonny
|
|
|
|
|
Hi jonny,
Thanks for reply.
Ok, In your code,
foreach (Control control in this.Controls)
{
Console.WriteLine(control.Name.ToString());
//Update progress
this.workerReportProgress();
}
I will have to call workerReportProgress() in the lenghy work function. It is ok if my lenghty work function is lenghty just because of infinite or long numbered for loop. But What about a lenghty work which is lenghty by itself (without for loop) ! My problem is like,
void lenghyFunction()
{
sendEmail();
}
HEre, sendEMail is very lenghy itself (becasue of huge attachments etc..), now how can i call reportProgress method of BW as it is not any forloop.
Thanks and regards
Emran
|
|
|
|
|
What you need is to ge tthe progress of the SendEmail method, unless that reports progress, then you are not going to be able to.
Often there is an equivalent BeginSendMail() method which would start it asynchronously, and perhaps report progress as an event.
|
|
|
|
|
Hi J4amieC,
Thanks for the reply. Yes, you got it. I guessed that C#.NET's background worker is smart enough to determine the percentage of work it is assigned even though i did not make my sendEMail function progress reportable. Now it looks like, what I was expecting is impossible unless I make my sendEMail function progress reportable or any method of .NET i am using which reports progress. Right ?
|
|
|
|
|
Hi Emran,
Yes I agree with J4amieC - expose the email progress through (I assume your using Ouklook) the Outlook interop...
Why not have 2 progress bars - 1 containing overall progress (All Emails) and 1 containing progress for 1 Email (this is of course assuming you can expose progress)....and what about a Status Bar, containing a label updating the updating user in text - e.g. 'Sending 1 of 10 emails...' etc
HTH
Jonny
|
|
|
|
|
Hello Jonny,
Thanks for the reply.
I did not see any progress change property of smtp send method of .NET 2.0. Can you show me any reference code snippet or article which sends email with progress or status ?
Thanks and regards
Emran
|
|
|
|
|
Can I suggest you bite the bullet and just report progress as "Sending email 1 of 10"... after all that is exactly the way my (and most ive seen) email program operates. When it takes a long time for the progress bar to move, I know it is because it is uploading/downloading a large email.
|
|
|
|
|
Yes, I agree - you could always expose the size of file attachments and report on them as well..
let us know how you get on.
Jonny.
|
|
|
|
|
Thanks, I need to do some experiments.
|
|
|
|
|
Hi there,
I am using a DataGridView with an Add button.
On pressing the Add button, I add a new row to a table in the underlying dataset.
Heres the problem : I then want to set the focus to the first cell of the added row - and for the user to start typing the contents of the cell, without haveing to click on the cell....
heres a code snippet :
.....
dataGridViewInvoices.Rows[i - 1].Cells[0].Selected = true;
then I guess I need something like the Set equivalent of -
dataGridViewInvoices.Rows[i - 1].Cells[0].IsInEditMode = true; //Invailid as property is read only.
.....
any ideas?
Thanks
Jonny
|
|
|
|
|
answered my own question....
int i = dataGridViewUsers.RowCount;
dataGridViewInvoices.CurrentCell = dataGridViewInvoices.Rows[i - 1].Cells[1];
dataGridViewInvoices.BeginEdit(false);
Jonny
|
|
|
|
|
hai i have to save the current time to my data base. i want the type casting of converting string to byte.
|
|
|
|
|
Maybe the gods have mercy on your soul
|
|
|
|
|
Man, you really have to do some research on your side, or you will never learn. Besides that, your questions are really obscure.
Here is a hint on converting a string to bytes: System.Text.Encoding. Have a look at the documentation. Also, if you want to save the current date to your database, there is usually an easier way. For instance, SQL Server has a getdate() function:
update MyTable
set MyDateColumn = getdate()
where .....
--------
"I say no to drugs, but they don't listen."
- Marilyn Manson
|
|
|
|
|
Encoding.<UTF8|ASCII|Unicode|...>.GetBytes(yourstring);
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Hello!!
I'm using C#
Assume I have an application containing a form named form.cs.
When you create the look for the form you use the form designer
to construct the look that you want.
All changes that you do in form designer are put into method InitializeComponent.
Assume the form have many more controls than these three controls mentioned just below.
The controls that are interesting for my question are:
Two buttons called put_in_box and get_from_box.
One label showing the correct time.
One datagrid.
The property for these controls is located in the InitializeComponent as I mentioned earlier.
Assume another customer requirement on the form is quite similar to form form.cs.
The only difference is that some controls should not be displayed and some other controls be added instead.
The followings controls should not be displyed for the new customer.
The two buttons named put_in_box and get_from_box.
A label showing current time.
A datagrid.
The new customer want to have a combobox in the same location as the datagrid.
We can assume that if you compare the appearance of the form between the two customer much is the same.
Now to my problem.
1. I want to have only one form in this case form.cs. So no duplication of code.
2. In an easy way being able to have two appearance(look) of the same form which is named form.cs.
3. Being able to change the appearance(look) for any of these two customer in an easy way..
4.The form designor is always looking for InitializeComponent when you want to change the appearance(the look) for the form.
5. If I had used MFC I would have used the resource files which store the look for a form in a named resource file. One customers look had been stored in one resource file and the other customer look would have been stored in another resource file but the code would only be in one place so no duplicate code
I can't find any good solution to my problem.
- One solution which is bad is to have two forms having one form for each customer which also duplicate the code. For example having form.cs and form_xyz.cs
- Another solution which is very bad is to have two InitializeComponent
InitializeComponent_abc and InitializeComponent_xyz. One for each customer.
When you want to edit the appearance(the look) for a customer xyz you have to rename InitializeComponent_xyz to InitializeComponent because the form designed is always looking for InitializeComponent. As a summary a lot of renaming here and there.
I wonder if you could help me with a good solution if there exist one.
//Tony
|
|
|
|
|
Tony,
It sounds like these are different applications, so I'd suggest creating different forms. Also, don't do *anything* to the code inside InitializeComponent() - your changes will most probably be lost. Instead, in the form ctor, add your changes *after* the call to InitializeComponent().
HTH.
Cheers,
Vikram. "When I read in books about a "base class", I figured this was the class that was at the bottom of the inheritence tree. It's the "base", right? Like the base of a pyramid." - Marc Clifton.
|
|
|
|
|
Hello!!
The main point is to avoid having to duplicate the code but if I use your suggestion then the code will be duplicated when I have two forms.
If I understand you right as you say these will be two separate application having it's own lives with it's own form.
Assume instead that the form between two customer were identical accept the colour on one single button. Do you still suggest that the best suggestion is to have two different application with it's own form.
I don't know if you are familiar with MFC but as I mentioned in the previous mail this is easy to solve in MFC.
So do you think that there doesn't exist any solution which is as good as the MFC solution of this problem.
If I just mention resource files. Resource files is having a different meaning and purpose in .Net compare to MFC. So to use resource files to solve my problem is not posssible in .NET(C#).
//Tony
|
|
|
|
|
There may be no best solution for it but here's some of my thoughts:
1. Seperate the logic and interface. You duplicate codes on the form but keeping the logics in 1 place. Probably this is too late for you to do now.
2. Have only 1 form, but a lot of switches to turn on/off the controls. But it will get very messy and confusing. I have seen forms and panels overlapping each other in one of our product and it's a nightmare just to look at the codes.
3. Put the core stuffs in a base form and inherit the forms into 2 forms (possible?), add new requirement on each new forms as required. If you have a 3rd requirement for new customer, it can support it well enough.
4. Duplicate everything into 2 forms. Harder to maintain but not as bad as (2).
Out of these few, I think 1 and 3 are the better one.
|
|
|
|
|
Hi all,
I would like to customize a text box so that it holds a collection.
How can this be done? (i.e.) I want to override the text box similar to a listbox, but only one item should be visible at a time and there should not be any scroll bar.
Thanks in advance.
Thanks and Regards
Madhu
|
|
|
|
|
you can derive a class from the TextBox class and then define
the properties that u want for the derived textbox.
you can define an object of the Arraylist to contain the collection
of the textbox.
Hope u get it
Regards,
Pramod
|
|
|
|