|
Please do not be offended by this, but your design seems to me to be a little odd. Of course there may be constraints on you that I am unaware of and if so, please ignore this.
The point about a DataGridView is that it can display many rows of information. Bearing that in mind, why not simply load all of the data into the grid and allow the user to scroll up and down to locate the CODE they are interested in, or provide a search mechanism to allow them to enter a CODE into a TextBox and the grid would scroll the correct line into view.
Doing it in the way that you are proposing would indicate that you are using a single row, which, as I said, is slightly unusual. If you wish to do it one item at a time why not simply use a normal ComboBox on the form, with two TextBoxe s for DESCRIPTION and PRICE. Then when the user makes a selection from the CODE ComboBox you can use a paramaterized SELECT statement to fill the TextBoxes with the correct data for editing or whatever.
If on the other hand your grid would have more than one row, all blank until the user selects a CODE, this could become very confusing, with the same data being repeated in different rows, this would be a nightmare for the user and for yourself from a maintenance point of view.
I hope that this helps you, but if not please come back.
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
Hi Henry,
Thanks for you replys , the design I am trying to implement is the same type of ordering entry system as MYOB Accounting, Microsoft Office Accounting and many others, . . I'm only including minimal infomation regarding this to avoid confusion, and to avoid over complicating my question, . . I will try explain it another way
These are the items in the DataGridView (CODE, DESCRIPTION, PRICE)
(There are more e.g. qty, tax etc.. however once I figure out how to do it with one column the rest will be easy, so no need to over complicate things)
--------------------------------------
CODE | DESCRIPTION | PRICE <--DataGridView Column Headers
--------------------------------------
______|v|_____________________________
^
|
The 'CODE' Column is a ComboBox populated with Item/Product Codes (read from a database (tbl_products))
When the user selects a 'product code' from the combo box the Description & Price cells are automatically populated with the relevant infomation, and a new blank row added to the DataGridView to allow another line for this order to be added
--------------------------------------
CODE | DESCRIPTION | PRICE
--------------------------------------
ITM001|v| Item 01 Misc | $100.00 <--- The user selected (ITM001) From the product code
______|v|_____________________________ <- The Description (Item 01 Misc) and price ($100) was auto-
| matically added to the remaining cells (This was read from
| infomation in a database (tbl_products))
|
|
Once an item has been added to the datagridview
a new (empty) line will be added to the datagridview
to allow users to add multiple items/products to a
single order.
The reason for implementing this type of data entry, is to allow the user to add as many (or as little) items to 1 order as needed, also with the infomation (DESCRIPTION & PRICE) being automatically inserted, this will create minimal errors and countless hours typing descriptions and prices (as anyone who has done data entry knows can be painfully annoying )
I hope this explains what I am trying to acomplish. If you need any insight to what I am trying to do Microsoft Office Accounting has an order entry system that does exactly what I am trying to acomplish.
I have included a link ^]">here to a screenshot of a quote entry form in MOA (Microsoft Office Accouting) I hope this will be useful.
Thank you for your replys, . . I apologise for my lack of explaination (and rather lengthy reply :-P) I hope this helps.
Many thanks
|
|
|
|
|
|
Oh I should mention that the image I linked to HERE|^|
the name column in the datagridview (when a code/name is added to the list) the description/price/tax etc.. is automatically added this is what I am trying to achieve.
Again I hope this explains my situation.
|
|
|
|
|
OK.
Now I understand.
I have something that I think might help, at least in part, all I have to do is find it again.
As soon as I do, I'll come back to you, shouldn't be too long.
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
Many thanks, Highly appreciated!
I anxiously wait for your reply
|
|
|
|
|
If you could handle SelectedIndexChanged (or any suitable ComboBox event) for your DataGridViewComboBoxColumn it would give you the opportunity to get the necessary values from the Database.
Here's a nifty way that you can do that by handling the OnEditControlShowing event of the DataGridView . Something like this:
ComboBox hookedCombo = null;
private void OnEditControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGrid.CurrentCell.ColumnIndex = 0)
{
hookedcombo = (ComboBox)e.Control;
if (hookedCombo == null)
{
return;
}
hookedCombo.SelectedIndexChanged += this.OnComboIndexChanged
}
}
OnComboIndexChanged is a standard ComboBox.SelectedIndexChanged handler.
I hope that this is of some help, or at least gets you started in the right direction.
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
Many thanks, I will have a play around with this and let you know my progress
Thank you for your assistance Much appreciated
|
|
|
|
|
Do you need it in VB?
I had a brain fart and translated it into c# from VB to post it to you.
Here it is anyway.
Dim HookedCombo as ComboBox
Private Sub OnEditControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles m_Grid.EditingControlShowing
If m_Grid.CurrentCell.ColumnIndex = 0 Then 'use the index for your comboboxcolumn
HookedCombo = TryCast(e.Control, ComboBox)
If HookedCombo Is Nothing Then
Return
End If
AddHandler HookedCombo.SelectedIndexChanged, AddressOf OnComboIndexChanged
End If
End Sub
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
Hey it would be great to have it in VB, I have been trying to translate it manually and so far come up with
<br />
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing<br />
<br />
If DataGridView1.CurrentCell.ColumnIndex = 0 Then<br />
<br />
<br />
<br />
<br />
End If<br />
End Sub<br />
lol, not a great start at translating but a start nether the less. . lol . . if you could provide in VB that would be great
|
|
|
|
|
I have already modified my last post.
Good Luck!
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
Hey I have found a way to do exactly what i want to achieve; the only problem is . . . the required values are only added once the row has 'lost focus' and not when selected from the combobox
here is the code
(Again a collection of dummy string values have been added to the combobox for ease)
Public Class Form1
Private Sub DataGridView1_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.RowValidating
Dim row As DataGridViewRow = DataGridView1.Rows(e.RowIndex)
If Not row.Cells("Column1").Value Is Nothing Then
If row.Cells("Column1").Value.ToString = "Prod 01" Then
Dim coid As String = "Product Description 01"
row.Cells("Column2").Value = coid
row.Cells("Column3").Value = "1.00"
row.Cells("Column4").Value = "10.00"
e.Cancel = False
End If
If row.Cells("Column1").Value.ToString = "Prod 02" Then
Dim coid As String = "Product Description 02"
row.Cells("Column2").Value = coid
row.Cells("Column3").Value = "1.00"
row.Cells("Column4").Value = "11.00"
e.Cancel = False
End If
End If
End Sub
End Class
Any ideas on how to implement this using the code you posted earlier? . . I have tried many times but unable to figure out how to string it all together.
The above code works perfectly (as far as i can tell at present anyway) other than the fact, it generates the values once focus has been lost from the row and NOT when the user selects it from a value in the combobox.
It's taken me most of the day through countless hours of web searching and trialing to get this far, hopefully we can get this problem sorted and perhaps an article may have to be written to help other users (im sure i'm not the only one wanting to achieve this) because there is nothing that I have found on the net addressing this issue.
anyways thanks for your help so far, . .i trust we will put this issue to bed soon (i can almost taste it)
Many Thanks
|
|
|
|
|
Thank you for your code, this is starting to give me an insight as to what I need to do.
Here is what I have done, however I am unable to get this to work I am VERY new at this and dont quite know what event to fire
Dim HookedCombo As ComboBox
Public Sub OnComboIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim strItemCode As String = Trim(HookedCombo.Text) 'Value Of ComboBox
'#NOTES#-----------------------------------------------------------------------
'I have populated the combobox with some dummy string values
'Item 01, Item 02, Item 03 etc....
'In my final atempt I will just read this off a database but I first
'need to understand how to get this to work without complicating it with
'a database.
'
'The next line does not work I keep geting the error;
'
'Index was out of range. Must be non-negative and less than the size of the collection.
'Parameter name: index
'
'I have noted that when the DataGridView loads (blank) the row count is 1
'using that I tried to deduct the row count (i) by 1 (i-1) however i still get the same
'problem.
If strItemCode = "Item 01" Then
Dim i As Integer = DataGridView1.SelectedRows(0).Index
DataGridView1.Rows(i).Cells(1).Value = "Item Description 01"
End If
End Sub
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
If DataGridView1.CurrentCell.ColumnIndex = 0 Then
HookedCombo = TryCast(e.Control, ComboBox)
If HookedCombo Is Nothing Then
Return
End If
AddHandler HookedCombo.SelectedIndexChanged, AddressOf OnComboIndexChanged
End If
End Sub
Any ideas?
|
|
|
|
|
Hi, just got to my computer, I've been doing Banking, Shopping - you know - boring stuff like that.
Two things that you can try, while I am looking into this, and your other post.
First: This is just a general point. Whenever an event handler is used to handle a given event for more than one control you should use the sender parameter to determine which of the controls you are dealing with. In this particular case it doesn't matter but it is a good habit to get into.
So:
Public Sub OnComboIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim TheCombo As ComboBox = CType(sender, ComboBox)
Dim strItemCode As String = Trim(TheCombo.Text) 'Value Of ComboBox
' This means that you always get the "Text" of the ComboBox that caused this event
' As I said above, in this particular case that is the same thing as HookedCombo, but that won't always be true
is preferred to:
Public Sub OnComboIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim strItemCode As String = Trim(HookedCombo.Text) 'Value Of ComboBox
Second:
Try changing:
If strItemCode = "Item 01" Then
Dim i As Integer = DataGridView1.SelectedRows(0).Index
DataGridView1.Rows(i).Cells(1).Value = "Item Description 01"
End If
to:
If strItemCode = "Item 01" Then
DataGridView1.CurrentRow.Cells(1).Value = "Item Description 01"
'The point is, and probably the reason you are getting the error, although you are 'using' a particular row
' it may not be selected and therefore won't appear in the SelectedRows collection. However CurrentRow
' always points at the row with the cursor in.
End If
I'll have a look at your other post now, and I'll wait a bit before replying, assuming I have something to say of course , just in case the above works. Perhaps you'll let me know?
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
Hey thanks!! Will make the above changes today and let you know my progress, I have a massive (non-computer orientated) day today so may not get the chance until later on tonight. But will keep you informed.
Thanks Again
|
|
|
|
|
Hey thanks for your help, I am still trying to work this issue out have been flat out lately and not at my computer alot so progress is becoming very slow, . . however i will keep you posted on my progress. Have you managed to find a way?
|
|
|
|
|
The following works as I think you described your requirements.
Public Class DGVComboIndexChangedForm
Private productListMember As List(Of String) = New List(Of String)
Dim HookedCombo As ComboBox
Private Sub DGVComboIndexChangedForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
productListMember.Add("Product 1")
productListMember.Add("Product 2")
productListMember.Add("Product 3")
CType(Me.dgvItems.Columns("ItemID"), DataGridViewComboBoxColumn).DataSource = Me.ProductList()
End Sub
Private Sub OnEditControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles dgvItems.EditingControlShowing
If dgvItems.CurrentCell.ColumnIndex = 0 Then 'use the index for your comboboxcolumn
HookedCombo = TryCast(e.Control, ComboBox)
If HookedCombo Is Nothing Then
Return
End If
AddHandler HookedCombo.SelectedIndexChanged, AddressOf OnComboIndexChanged
End If
End Sub
Public Property ProductList()
Get
Return Me.productListMember
End Get
Set(ByVal value)
Me.productListMember = value
End Set
End Property
Private Sub OnComboIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim TheCombo As ComboBox = CType(sender, ComboBox)
Dim strItemCode As String = Trim(TheCombo.Text) 'Value Of ComboBox
Select Case (strItemCode)
Case "Product 1"
dgvItems.CurrentRow.Cells("ItemStock").Value = "1"
dgvItems.CurrentRow.Cells("ItemPrice").Value = 1.1
Case "Product 2"
dgvItems.CurrentRow.Cells("ItemStock").Value = "2"
dgvItems.CurrentRow.Cells("ItemPrice").Value = 2.2
Case "Product 3"
dgvItems.CurrentRow.Cells("ItemStock").Value = "3"
dgvItems.CurrentRow.Cells("ItemPrice").Value = 3.3
End Select
End Sub
End Class
It is essentially as per the mods I suggested in my last post.
The class above is a Form with a DataGridView called dgvItems .
I manually added three columns to the grid using the Add Columns option from the Smart Tag on the DataGridView
1) DataGridViewComboBoxColumn named ItemID
2) DataGridViewTextBoxColumn named ItemStock
3) DataGridViewTextBoxColumn named ItemPrice
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
|
|
|
|
|
Hi,
I'm a french network admin and I need some help to implement the code on this page:
Implementing a Read-Only 'File Open' or 'File Save' Common Dialog[^]
I work in a internet café and a lot of my young users uses this dialog box to navigate in the system file and destroy all my security settings.
This article is exactly what I'm searching for several mouth ago but... I'm not a developer!
Can someone explain to me how to implement this code by a step by step guide? It will be very great. And is there a way to reverse it if I need?
Sorry for my poor langage and my "noob" post but I really need some help.
Thanks for your answers.
Best regards,
Greg.
modified on Sunday, July 26, 2009 9:39 AM
|
|
|
|
|
Hi Greg. I am guessing this is a security problem rather than a programming one. If patrons of your internet café have the security access to modify your system files, that's what you need to address. Just make sure your "important files" are set to be accessible only by administrators, then make sure the accounts your patrons are using have significantly less privileges.
|
|
|
|
|
Hi Mike,
First thanks for your answer but I really need to implement this code. I try to explain to you my problem.
I have 16 computers running Xp Home and no domain, I 'm using a Cybercafé program named "Cyberlux" who need the administrative rights to run, and all my computers have 20 games installed on it. I have modified a lot of registry keys to ameliore the settings security and I have hide all the disk and importants documents on it but some of my young users find the way to access to all the system file with this f****** dialog boxes.
The hack : They go on a Web page where you can upload an image for exemple with a "browse" button on it, the dialog box open, they just have to put the entire path of a file on the field "Name of the file" to acceed where they want (hidden files or not). They go to the folder of my cybercafé program and move or delete the security files.
I hope you understand my problem and can explain to me how to apply this code.
Thanks for your answers.
|
|
|
|
|
You can't use this code to replace the File Dialogs in other applications. You REALLY need to overhaul your networks security so that your users do not have permissions to do anything that they are not supposed to do.
|
|
|
|
|
Okay,
Thanks for your reply I try to found another way to block the access to my important system files.
Best regards,
Greg.
|
|
|
|
|
Yeah, it's a matter of setting proper NTFS permissions on your folders.
|
|
|
|
|
It's not so easy, look at my answer to Mike Ellison, I explain exactly my problem.
Perhaps you know a registry key I can modify to completly disable this dialog box?
Thanks.
|
|
|
|
|
Yeah, I read that, and my answer does not change.
The base of the problem is that you're running an app that needs admin permissions. Either find another app, or learn how Windows security works. You can create an admin equivilent ID that has no permissions to various parts of the file system.
There is no way to disable those dialog boxes.
|
|
|
|
|