the code is perfect, but how can i lock the check items (ONLY REQUIRED items) in listview?
lvFees.Columns.Add("Fee", 120)
lvFees.Columns.Add("Amount", 76)
connect()
rec.Open("select * from tablePayments where sem='" & cboSem.Text & "'", con, 3, 3)
If rec.RecordCount <> 0 Then
Dim i As Integer = 0
Do Until rec.EOF
lvFees.Items.Add(rec("payname").Value)
lvFees.Items(i).SubItems.Add(rec("amount").Value)
If rec("paytype").Value = "REQUIRED" Then ' the paytype has two options, the "REQUIRED" and OPTIONAL.
lvFees.Items(i).Checked = True
End If
rec.MoveNext()
i = i + 1
Loop
End If
rec.Close()
con.Close()
i want to lock the check of all REQUIRED item, while letting the user to check and uncheck the OPTIONAL items
I'm sure there are lower-level ways of accomplishing this, such as by inheriting the ListView class and overriding some of its behavior, but for a simpler approach, you could simply force the value in the ItemChecked event. You could use the Tag property of each item in the list to keep track of its "locked" value. For instance, if you loaded a ListView control with three items like this:
ListView1.Items.Add("Unlocked")
ListView1.Items.Add("Locked On").Tag = True
ListView1.Items(1).Checked = True
ListView1.Items.Add("Locked Off").Tag = False
And then put code like this in the ItemChecked event handler:
Private Sub ListView1_ItemChecked(sender As Object, e As ItemCheckedEventArgs) Handles ListView1.ItemChecked
If e.Item.Tag IsNot Nothing Then
e.Item.Checked = DirectCast(e.Item.Tag, Boolean)
End If
End Sub
Then that makes it so the check box of the first item can be altered by the user, but the other two items are locked in their respective states.
Related
I have a ContextMenuStrip called: DGVContextStrip its displayed when the user right clicks on my datagridview.
That MenuStrip contains an item called AddUpgradeTagToolStripMenuItem
which contains sub items(dropdownitems), these sub items are all named with a number in their name.
eg: Add1ToolStripMenuItem, Add2ToolStripMenuItem, Add3ToolStripMenuItem.... and so on until Add25ToolStripMenuItem.
When a user right clicks, on the Datagridview, I want to check if a cell contains the number "1" then if it does make Add1ToolStripItem.checked = true
I figured I would loop through the numbers 1 to 25, and in each loop check if the cell contains 1 and if true, change the checked value of the menu item. something like...
For i = 1 to 25
If DataGridView1.SelectedRows(0).Cells("Text_Field").Value.ToString.Contains(i) then
CType("Add" & i & "ToolStripMenuItem", ToolStripMenuItem).Checked = True
Next
but this doesn't work, iv seen examples online that use the control.find method but i couldn't get that to work for my use.
for example
Dim ControlName As String = "Add" & i & "ToolStripMenuItem"
CType(Me.Controls.Find(ControlName, True), ToolStripMenuItem).Checked = True
any ideas how I get this to work? I realise I could have used 25 if then else statements but I kind of wanted to keep the code far neater.
The ToolStripItem is not a control to search for one in a Control.ControlCollection. You need to search a ToolStripItemCollection where it belongs.
Just like the Control.ControlCollection.Find method, the ToolStripItemCollection.Find method can perform a deep search for an item.
Examples for your case:
Dim itemName As String = $"Add{i}ToolStripMenuItem"
Dim tsmi = yourContextMenuStrip.Items.
Find(itemName, True).
OfType(Of ToolStripMenuItem).
FirstOrDefault()
If tsmi IsNot Nothing Then
tsmi.Checked = True
End If
Alternatively, if you already know that the target item is one of the AddUpgradeTagToolStripMenuItem drop down items, then you can do:
Dim itemName As String = $"Add{i}ToolStripMenuItem"
Dim tsmi = DirectCast(AddUpgradeTagToolStripMenuItem, ToolStripMenuItem).
DropDownItems.OfType(Of ToolStripMenuItem).
FirstOrDefault(Function(x) x.Name.Equals(itemName, StringComparison.OrdinalIgnoreCase))
If tsmi IsNot Nothing Then
tsmi.Checked = True
End If
In case you need to check only one item from the collection:
Dim itemName As String = $"Add{i}ToolStripMenuItem"
For Each tsmi In DirectCast(AddUpgradeTagToolStripMenuItem, ToolStripMenuItem).
DropDownItems.OfType(Of ToolStripMenuItem)
If tsmi.Name.Equals(itemName, StringComparison.OrdinalIgnoreCase) Then
tsmi.Checked = True
Else
tsmi.Checked = False
End If
Next
I have accomplished to search my list view item, but unfortunately it shows the first result only and nothing beyond that
This is my code
Private Sub ULButton1_Click(sender As Object, e As EventArgs) Handles ULButton1.Click
If ComboBox2.Text = "" Then
MessageBox.Show("Please select an office")
Else
Dim itm As ListViewItem
itm = Me.ListView2.FindItemWithText(TextBox1.Text)
If Not itm Is Nothing Then
ListView2.SelectedItems.Clear()
ListView3.Clear()
ListView3.View = View.Details
ListView3.FullRowSelect = True
ListView3.GridLines = True
ListView3.Sorting = SortOrder.Ascending
ListView3.Columns.Add("Username", CInt(ListView1.Width / 2))
ListView3.Columns.Add("Name", CInt(ListView1.Width / 2))
Me.ListView2.Items.Item(itm.Index).Selected = True
For Each itm2 As ListViewItem In Me.ListView2.SelectedItems
Me.ListView3.Items.Add(ListView2.Items(itm2.Index).Clone())
Next
Else
MessageBox.Show("Not Found", "")
End If
itm = Nothing
End If
End Sub
When I enter a string in the textbox, this code will show results of listview item in another listview, is there a way I can modify this to show multiple related items to the string I enter in the textbox?
Thank you
FindItemWithText finds only the first matching item.
You would need to use another form or that function that takes the starting index and keep finding next item in a loop.
Also, this fragment looks strange:
Me.ListView2.Items.Item(itm.Index).Selected = True
For Each itm2 As ListViewItem In Me.ListView2.SelectedItems
Me.ListView3.Items.Add(ListView2.Items(itm2.Index).Clone())
Next
You iterate over selected items, but you just selected one! An you already know it's index...
So, I've got 4 Comboboxes. They all share the same list of options, lets say Apple, Banana, Carrot, Dill.
However, once the user selects one, that selection should not be available in the other comboboxes. E.g. if they pick Apple in Combobox1, then the only selections available in Combobox2, 3, and 4 should be Banana, Carrot, and Dill.
Is there a good way to do this? I originally thought to link the boxes datasource to a list containing the options, but they need separate datasources for separate choices.
Radio and checkboxes aren't really an option in the actual program, as the list of options is much larger than 4. A Combobox seems to be the best way to represent the user's available choices here.
Here's a fairly simple way to do what you are asking. This code assumes that the datasource uses an integer value to keep track of the items. If you are using the string value itself {Apple, Banana, etc.} as the id, the code will need to be amended slightly. If you need further help let me know but hopefully this gets you on the right track.
You can test this by creating a new blank form (Form1) and drop 4 combo boxes onto it (ComboBox1, ComboBox2, ComboBox3, ComboBox4). Copy/paste this code over top of the form code and run to see how it works:
Public Class Form1
Dim oComboBoxArray(3) As ComboBox
Dim bPreventSelectedChange As Boolean = False
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Set up an array with the combo box references to reduce code size by using loops later
oComboBoxArray(0) = Me.ComboBox1
oComboBoxArray(1) = Me.ComboBox2
oComboBoxArray(2) = Me.ComboBox3
oComboBoxArray(3) = Me.ComboBox4
' Populate all four combo boxes with the same datasource to start
For Each oCbo In oComboBoxArray
PopulateDataSource(oCbo)
Next
End Sub
Private Sub PopulateDataSource(oCombo As ComboBox, Optional nIdToSelect As Integer = 0)
bPreventSelectedChange = True ' Prevent code in ComboBox_SelectedIndexChanged from executing while we change the datasource
' Using manually populated datatable as datasource because it's quick and easy to use
Dim dt As New DataTable
Dim dr As DataRow
dt.Columns.Add("ID", GetType(Int32))
dt.Columns.Add("Name", GetType(String))
' Need to have some kind of "Please select an item:" in the list or else we will be unable to clear an already selected combo box
dr = dt.NewRow
dr("ID") = 0
dr("Name") = "Select..."
dt.Rows.Add(dr)
' If you are populating from a database or other dynamic source you will only have one of these 'if' statements within a loop
If CheckSkipItem(oCombo, 1) = False Then
dr = dt.NewRow
dr("ID") = 1
dr("Name") = "Apple"
dt.Rows.Add(dr)
End If
If CheckSkipItem(oCombo, 2) = False Then
dr = dt.NewRow
dr("ID") = 2
dr("Name") = "Banana"
dt.Rows.Add(dr)
End If
If CheckSkipItem(oCombo, 3) = False Then
dr = dt.NewRow
dr("ID") = 3
dr("Name") = "Carrot"
dt.Rows.Add(dr)
End If
If CheckSkipItem(oCombo, 4) = False Then
dr = dt.NewRow
dr("ID") = 4
dr("Name") = "Dill"
dt.Rows.Add(dr)
End If
oCombo.DataSource = dt
oCombo.DisplayMember = "Name"
oCombo.ValueMember = "ID"
oCombo.SelectedValue = nIdToSelect ' Set value to either a) the "Select..." item or b) the item that was selected previously depending on the situation
bPreventSelectedChange = False ' Allow code in ComboBox_SelectedIndexChanged to be executed by user again
End Sub
Private Function CheckSkipItem(oCombo As ComboBox, nID As Integer) As Boolean
Dim bSkip As Boolean = False
' Loop through all combo boxes and see if this id has already been chosen in another combo box
For Each oCbo In oComboBoxArray
If oCbo IsNot oCombo AndAlso oCbo.SelectedValue = nID Then
' It has been chosen already so it is not valid for the current combo box that we are checking
bSkip = True
Exit For
End If
Next
Return bSkip
End Function
Private Sub ComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged, ComboBox2.SelectedIndexChanged, ComboBox3.SelectedIndexChanged, ComboBox4.SelectedIndexChanged
' Jump out of this event if the bPreventSelectedChange boolean is set to true (ie. if the combo box is being repopulated)
If bPreventSelectedChange = False Then
' A value was chosen by the user. Reset all other combo box datasources and remove the recently selected value
For Each oCbo As ComboBox In oComboBoxArray
If sender IsNot oCbo Then
PopulateDataSource(oCbo, If(oCbo.SelectedValue = Nothing, 0, oCbo.SelectedValue))
End If
Next
End If
End Sub
End Class
I have a collection of buttons on a panel, I want to be able to build a collection of those buttons and then sort the buttons by the text on the button. However, I am stuck. This is what I have so far, but I can't figure out how to sort.
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim btn1 As Control
Dim btnArray(0 To 3) As Button
btnArray(0) = btnAll
btnArray(1) = btnWine
btnArray(2) = btnBeer
btnArray(3) = btnNonAlcoholic
For Each btn1 In btnArray
Next
End Sub
You can use a simple manual bubble sort:
Dim Changed as Boolean = False
Do
Changed = False
For i = 0 to btnArray.Count - 2
If btnArray(i).Text > btnArray(i+1).Text Then '< > work for strings as well and they check 'position' in the alphabet. So "A" < "B" and so on
'If order is wrong, switch the two buttons
Dim temp as Button = btnArray(i+1)
btnArray(i + 1) = btnArray(i)
btnArray(i) = temp
Changed = True
End If
Next
'Do this until no more switches are necessary
Loop Until Changed = False
This will order your buttons and is reasonably fast for low numbers of buttons. You could use a list and a custom IComparer object as well and simply call List.Sort with the custom comparer.
See here for example implementations of this approach for a similar problem: http://msdn.microsoft.com/en-us/library/cfttsh47%28v=vs.110%29.aspx
Using LINQ:
btnArray = btnArray.OrderBy(Function(btn) btn.Text).ToArray
I came up with following code that adds number of columns based on user input in textbox1, but how to add names to these columns? (Columns added should have names like, A1,A2,A3.......on the top most row)
Dim t As Integer
t = Val(TextBox1.Text)
For i = 1 To t
Form2.DataGridView1.ColumnCount = i
Next
Also can we freeze specific cells in a datagridview i.e. cells which user cannot edit?
Try this
DataGridView1.Columns(i).Name = String.Format("A{0}", i)
Once you have access to Columns(i) you can view available properties from the intellisense
DataGridView1.Columns(0).Frozen = True;
The DataGridView only has methods for freezing Rows or Columns, in order to block editing of a specific cell you can try adding a handler for the CellBeginEdit event then check for the Row and Column of the Cell(s) that you want to prevent editing of then cancel the event.
something like this:
Private Sub DataGridView1_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
If e.ColumnIndex = 0 And e.RowIndex = 0 Then
e.Cancel = True
End If
End Sub
this.dataGridView1.Columns["StudentId"].ReadOnly = true;
from: http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/fef91d76-24c5-4b41-84d7-ba133de2d9a7#b2cb53ec-5b15-4385-b086-28a6dc93dfc9