|
Can anybody tell me what is wrong with my logic in the following code? I am trying to get a string array to take the names of projects entered one at a time from a text box. I have to be able to add to, delete from and sort the list alphabetically.
I can't use SQL because most of the time this program will be used offline.
When I build and run it I am getting no errors until the button click after entering the text in the box.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace Construction_Survey_Layout
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int PN;
private void btnNew_Click(object sender, EventArgs e)
{
ArrayList Projects = new ArrayList();
Projects[PN] = textBoxAddNew.ToString();
Projects.Add(Projects[PN]);
textBoxAddNew.Clear();
Projects.Sort();
for(int ctr = 0; ctr <= PN; ctr++)
{
listBox1.Items.Add(Projects[ctr]);
}
PN++;
}
}
}
|
|
|
|
|
Darrall wrote: ArrayList Projects = new ArrayList();
Why do you do that on each click?
|
|
|
|
|
Sorry...I wasn't very explicit there. This program is for a construction survey program. Somebody first using this program would enter the name of the first project he worked on. Then as he went along each time he got a project he would add a new one so in reality the click event occurs once every few weeks but the data has to remain in the program.
|
|
|
|
|
Yes, but why create a new empty list each time?
|
|
|
|
|
Yes I caught that...Thanks
|
|
|
|
|
Darrall wrote: Projects[PN] = textBoxAddNew.ToString();
The entry at PN doesn't exist yet, since Projects has a count of 0 at that line.
Darrall wrote: Projects.Add(Projects[PN]);
This line almost never makes any sense (it can, sometimes). Even less in this case, since Projects[PN] can not exist (Projects still has a count of 0)
Just do Projects.Add(something) somewhere and forget about PN..?
And don't forget to add the rest of the things that you want in there - the way it is now you'd have just 1 item all the time (so sorting it does nothing)
Darrall wrote: ctr <= PN
Why not just ctr < Projects.Count ?
Then you could eliminate that confusing PN entirely
And please use a List<string>
|
|
|
|
|
Thanks for your answer
|
|
|
|
|
There are a number of things wrong here, not just that you get an error.
I assume you are new to C#?
Darrall wrote: // PN is the index. I didn't set it to 0 because I want it to retain it's value
// It is at 0 the first time run.
public int PN;
It will retain it's value anyway. Setting the inital vaule with
public int PN = 0; makes no difference at all. Each time you construct a Form1 object you will get a new PN, that starts at zero. If you want one PN that is shared by all instances of Form1, then make it static:
public static int PN = 0;
Don't declare fields as public unless you need them accessable outside the class, use private. You can easily create a public property which accesses teh field, which has the advantage that you can provide a getter only, and it becomes readonly to the outside world.
Darrall wrote: ArrayList Projects = new ArrayList();
This creates Projects as local to the btnNew_Click method - i.e. it is discarded when you exit. Since you keep the PN as part of the class, I would suggest this should be also.
Darrall wrote: // The error was directed at PN here.
Projects[PN] = textBoxAddNew.ToString();
Projects.Add(Projects[PN]);
textBoxAddNew.ToString() does not give you the data typed into the textbox - textBoxAddNew.Text does.
Projects[PN} does not exist. If it did, then these two statements would try to add the same string twice.
That is why you get the error message - you are trying to access an element that does not exist.
Don't use an ArrayList - use a List<String> instead - it restricts what you can add to the list to just strings (arrayList will take Strings, ints, doubles, anything).
Why do you bother with PN when the ArrayList and List both have a Count which is going to be exactly the same as PN anyway?
Why sort the Projects? Just set the Sorted property of your ListBox.
Why are you adding all the Projects strings to the List box each time?
Better way to do all this:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private List<string> Projects = new List<String>();
private void btnNew_Click(object sender, EventArgs e)
{
Projects.Add(textBoxAddNew.Text);
listBox1.Items.Add(textBoxAddNew.Text);
textBoxAddNew.Text = "";
}
}
[edit]Forgot the "encode "<" .. option when pasting. Again. Damnit![/edit]You should never use standby on an elephant. It always crashes when you lift the ears. - Mark Wallace
C/C++ (I dont see a huge difference between them, and the 'benefits' of C++ are questionable, who needs inheritance when you have copy and paste) - fat_boy
modified on Thursday, March 4, 2010 11:45 AM
|
|
|
|
|
Thanks very much for your help. Yes...I am new to C#. I used to program years ago but the last language I used was QB45 and I'm now trying to write my old programs in C#.
Thanks again
|
|
|
|
|
hi
i have 10 items in combobox1.
how to show all the combobox1 items in form_load without click on the downarrow of combobox1.
Thanks in advance.
|
|
|
|
|
Sounds like you want a ListBox then?I are Troll
|
|
|
|
|
Hi
Sorry it is not a listbox, Every thing is like combobox only.
but only the difference is,
It is Combobox only, but in formload the height of combo should be
in expandedmode(all combo items will be visible to the user)
|
|
|
|
|
I use ComboBox.MaxDropDownItems to choose the maximum number of visible items (max 100!);
you can set ComboBox.DroppedDown to make it show the items.
|
|
|
|
|
If I understood you right you mean this:
comboBox1.DroppedDown = true;Greetings
Covean
|
|
|
|
|
Hi
Thanks alot.it solves my combobox problem,
but the problem is with Cursor, it shows WaitCursor instead of showing Default Cursor.
Regards,
Pawan.
-- Modified Friday, March 5, 2010 1:26 AM
|
|
|
|
|
I can't reproduce your problem, but you can try this.
Cursor = Cursors.Default; Greetings
Covean
|
|
|
|
|
Hi
Working fine, but the problem is with clicks only.
To raise the EventHandlers i need to click the button for twice.
Let me know if u have any idea,
Thanks in advance.
-- Modified Friday, March 5, 2010 3:57 AM
|
|
|
|
|
Sorry I do not really understand what you mean.
Which button do you have to click twice?
If you just need that an event should be risen, then just call the event in your formload yourself.Greetings
Covean
|
|
|
|
|
I have set the ComboBox DroppedDown Property to true.
Now the actual problem is When the ComboBox DroppedDown is Shown Or True I have to actually click twice to get out of the form or need to click twice to do anything.
For Example in My Form If I have 2 Controls One is ComboBox and Another Button Which Clicked Just Closes the Form. Then I set ComboBox DroppedDown = true.So When the ComboBox DroppedDown = true to click on Close Button I need to click twice to initate click event on the button.
Plz Help me on how to do it once when ComboBox DroppedDown = true.If Combobox DroppedDown = true. I need to click twice to click on the Form as Well.
|
|
|
|
|
This is usually not possible, because if the combobox is dropped down it has the mouse capture.
If you set the mouse capture to an other control it directly loses dropped down state.
You maybe can try to redirect all mouse inputs from your combobox to the parent, but I don't
think that this is possible and even if its possible its hard to implement.Greetings
Covean
|
|
|
|
|
Hi
One more Question Regarding same combobox.Droppeddown
I have a Treeview1 inside my Combobox1
when i set Combobox.Droppeddown=true
it is not working.
Any Idea Plz let me know..
|
|
|
|
|
No sorry I never used a treeview in a combobox. Greetings
Covean
|
|
|
|
|
Thanks alot for your contribution..
Cheers,
Pawan.
|
|
|
|
|
Hi,
I am building a C# App using Windows Forms. It was working perfectly fine, suddenly there seems to be an System.Runtime.InteropServices.COMException.
The error code was copied to my clip board, here it goes:
System.Runtime.InteropServices.COMException was unhandled
Message="Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))"
Source="System.Windows.Forms"
ErrorCode=-2147221164
StackTrace:
at System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
at System.Windows.Forms.AxHost.CreateWithoutLicense(Guid clsid)
at System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
at System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
at System.Windows.Forms.AxHost.CreateInstance()
at System.Windows.Forms.AxHost.GetOcxCreate()
at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
at System.Windows.Forms.AxHost.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.AxHost.EndInit()
at WordRecoEngine.MainParentForm.InitializeComponent() in E:\Sample C# Codes\02-03-2010\Today(2-3-2010)\ProjectWithMap\WordRecoEngine\(Form1)MainParentForm.Designer.cs:line 81
at WordRecoEngine.MainParentForm..ctor() in E:\Sample C# Codes\02-03-2010\Today(2-3-2010)\ProjectWithMap\WordRecoEngine\(Form1)MainParentForm.cs:line 64
at WordRecoEngine.Program.Main() in E:\Sample C# Codes\02-03-2010\Today(2-3-2010)\ProjectWithMap\WordRecoEngine\Program.cs:line 42
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
The error is occuring in the following line of my code:
((System.ComponentModel.ISupportInitialize)(this.axShockwaveFlash1)).EndInit();
I don't know how to debug this exception, kindly suggest me a solution as early as possible. I tried dwonloading Flash.ocx and paste it into my System32 Folder, since Visual Studio 2008 indicated that it did not have that file, whenever I opened the project and closed the VS2008 project window. I have the latest version of the Adobe Flash Player installed on my computer. Also, I am using Windows 7 Ultimate x64.
Thanks.
Regards,
Clifford
|
|
|
|
|
Clifford Anup wrote: I tried dwonloading Flash.ocx and paste it into my System32 Folder
Doesn't work. You have to run REGSVR32 on it to register the control with the system.
|
|
|
|