The code examines the Checked property of the current node, as well as the Checked property of
its parent node. If either one is True, then the node is considered selected. You should try to add the
appropriate code to select all subordinate nodes of a parent node when the parent node is selected
(whether you deselect the subordinate nodes when the parent node is deselected is entirely up to you
and the type of application you’re developing). The Nodes collection exposes the GetEnumerator
method, which should be very familiar to you by now. You can revise the last listing so that it uses
an enumerator in the place of each 
For Each…Next
loop.
Adding New Nodes
The Add Node button lets the user add new nodes to the tree at runtime. The number and type of
the node(s) added depend on the contents of the TextBox controls:
If only the first TextBox control contains text, then a new continent will be added.
If the first two TextBox controls contain text, then:
If a continent exists, a new country node is added under the specified continent.
If a continent doesn’t exist, a new continent node is added, and then a new country node
is added under the continent’s node.
If all three TextBox controls contain text, the program adds a continent node (if needed),
then a country node under the continent node (if needed), and finally, a city node under the
country node.
Obviously, you can omit a city, or a city and country, but you can’t omit a continent name. Like-
wise, you can’t specify a city without a country or a country without a continent. The code will prompt
you accordingly when it detects a condition that prevents it from adding the new node for any reason.
If the node exists already, then the program selects the existing node and doesn’t issue any warnings.
The Add Node button’s code is shown in Listing 16.8.
Listing 16.8: Adding Nodes at Runtime
Private Sub bttnAddNode_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles bttnAddNode.Click
Dim nd As TreeNode
Dim Continents As TreeNode
If txtContinent.Text.Trim <> “” Then
Continents = GlobeTree.Nodes(0)
Dim ContinentFound, CountryFound, CityFound As Boolean
Dim ContinentNode, CountryNode, CityNode As TreeNode
For Each nd In Continents.Nodes
If nd.Text.ToUpper = txtContinent.Text.ToUpper Then
ContinentFound = True
Exit For
End If
Next
If Not ContinentFound Then
763
THE TREEVIEW CONTROL
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Save pdf to tiff - Convert PDF to tiff images in C#.net, ASP.NET MVC, Ajax, WinForms, WPF
Online C# Tutorial for How to Convert PDF File to Tiff Image File
convert pdf file to tiff file; converting pdf to tiff file
Save pdf to tiff - VB.NET PDF Convert to Tiff SDK: Convert PDF to tiff images in vb.net, ASP.NET MVC, Ajax, WinForms, WPF
Free VB.NET Guide to Render and Convert PDF Document to TIFF
c# convert pdf to tiff; pdf to multipage tiff
nd = Continents.Nodes.Add(txtContinent.Text)
End If
ContinentNode = nd
If txtCountry.Text.Trim <> “” Then
Dim Countries As TreeNode
Countries = ContinentNode
If Not Countries Is Nothing Then
For Each nd In Countries.Nodes
If nd.Text.ToUpper = txtCountry.Text.ToUpper Then
CountryFound = True
Exit For
End If
Next
End If
If Not CountryFound Then
nd = ContinentNode.Nodes.Add(txtCountry.Text)
End If
CountryNode = nd
If txtCity.Text.Trim <> “” Then
Dim Cities As TreeNode
Cities = CountryNode
If Not Cities Is Nothing Then
For Each nd In Cities.Nodes
If nd.Text.ToUpper = txtCity.Text.ToUpper Then
CityFound = True
Exit For
End If
Next
End If
If Not CityFound Then
nd = CountryNode.Nodes.Add(txtCity.Text)
End If
CityNode = nd
End If
End If
End If
End Sub
The listing is quite lengthy, but it’s not hard to follow. First, it attempts to find a continent that
matches the name in the first TextBox. If it succeeds, it need not add a new continent node. If not,
then a new continent node must be added. To avoid simple data-entry errors, the code converts the
continent names to uppercase before comparing them to the uppercase of each node’s name. The
same happens with the countries and the cities. As a result, each node’s pathname is unique. You
can’t have the same city name under the same country more than once. It is possible, however, to 
add the same city name to two different countries. The example is not quite realistic, as there are
common city names in every country.
Chapter 16 THE TREEVIEW AND LISTVIEW CONTROLS
764
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
C# Create PDF from Tiff Library to convert tif images to PDF in C#
desStream). Description: Convert to PDF/TIFF with specified resolution and save it into stream. Parameters: Name, Description, Valid Value.
pdf to tiff quality; file converter pdf to tiff
C# TIFF: Get to Start - Create, Load, & Save TIFF in C#.NET
C# TIFF - Create, Load and Save TIFF File. How to Load, Create and Save TIFF Image File Using C#.NET Programming. C# TIFF - How to Save TIFF Image File.
pdf to tiff converter online; convert pdf to tiff 300 dpi online
Listing Continents/Countries/Cities
The three buttons List Continents, List Countries, and List Cities populate the ListBox control with
the names of the continents, countries, and cities, respectively. The code is straightforward and is
based on the techniques discussed in previous sections. To print the names of the continents, it iter-
ates through the children of the GLOBE node. Listing 16.9 shows the complete code of the List
Continents button.
Listing 16.9: Retrieving the Continent Names
Private Sub bttnListContinents_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles bttnListContinents.Click
Dim Nd As TreeNode, continentNode As TreeNode
Dim continent As Integer, continents As Integer
ListBox1.Items.Clear()
Nd = GlobeTree.Nodes(0)
continents = Nd.Nodes.Count
continentNode = Nd.Nodes(0)
For continent = 1 To continents
ListBox1.Items.Add(continentNode.Text)
continentNode = continentNode.NextNode
Next
End Sub
The code behind the List Countries names is equally straightforward, although longer. It must scan
each continent, and within each continent, it must scan in a similar fashion the continent’s child nodes.
To do this, you must set up two nested loops, the outer one to scan the continents and the inner one to
scan the countries. The complete code for the List Countries button is shown in Listing 16.10. Notice
that in this example, I’m using 
For…Next
loops to iterate through the current level’s nodes, and I also use
the NextNode method to retrieve the next node in the sequence.
Listing 16.10: Retrieving the Country Names
Private Sub bttnListCountries_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles bttnListCountries.Click
Dim Nd, CountryNode, ContinentNode As TreeNode
Dim continent, continents, country, countries As Integer
ListBox1.Items.Clear()
Nd = GlobeTree.Nodes.Item(0)
continents = Nd.Nodes.Count
ContinentNode = Nd.Nodes(0)
For continent = 1 To continents
countries = ContinentNode.Nodes.Count
CountryNode = ContinentNode.Nodes(0)
For country = 1 To countries
ListBox1.Items.Add(CountryNode.Text)
765
THE TREEVIEW CONTROL
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
Convert to DOCX/TIFF with specified zoom value and save it into DocumentType.DOCX DocumentType.TIFF. zoomValue, The magnification of the original PDF page size.
pdf to tiff file converter; vb.net convert pdf to tiff
C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF
Description: Convert to PDF/TIFF and save it on the disk. Parameters: Description: Convert to PDF/TIFF and save it into stream. Parameters:
convert pdf to tiff quality; how to change pdf to tiff file
CountryNode = CountryNode.NextNode
Next
ContinentNode = ContinentNode.NextNode
Next
End Sub
When the 
ContinentNode.Next
method is called, it returns the next node in the Continents level.
Then the 
ContinentNode.Nodes(0)
method is called, and it returns the first node in the Countries
level. As you can guess, the code of the List Cities button uses the same two nested lists as the previ-
ous listing and an added inner loop, which scans the cities of each country.
The code behind these Command buttons requires some knowledge of the information stored in
the tree. It will work with trees that have two or three levels of nodes such as the Globe tree, but
what if the tree’s depth is allowed to grow to a dozen levels? A tree that represents the structure of a
folder on your hard disk, for example, may easily contain a dozen nested folders. Obviously, to scan
the nodes of this tree you can’t put together unlimited nested loops. The next section describes a
technique for scanning any tree, regardless of how many levels it contains. The code in the following
section uses recursion, and if you’re not familiar with recursive programming, then you should first
read Chapter 18.
Scanning the TreeView Control
The items of a TreeView control can all be accessed through the Nodes collection. You have seen
how to scan the entire tree of the TreeView control with a 
For Each…Next
loop. This technique,
however, requires that you know the structure of the tree, and you must write as many nested loops
as there are nested levels of nodes. It works with simple trees, but it’s quite inefficient when it comes
to mapping a file system to a TreeView control.
VB.NET at Work: The TreeViewScan Project
To demonstrate the process of scanning a TreeView control, I have included the TreeViewScan
project on the CD. The application’s form is shown in Figure 16.10. The Form contains a Tree-
View control on the left, which is populated with the same data as the Globe’s TreeView control,
and a ListBox control on the right, where the tree’s nodes are listed. Child nodes on the ListBox con-
trol are indented according to the level to which they belong.
Figure 16.10
The TreeViewScan
application demon-
strates how to scan
the nodes of a 
TreeView control
recursively.
Chapter 16 THE TREEVIEW AND LISTVIEW CONTROLS
766
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
C# Create PDF from Excel Library to convert xlsx, xls to PDF in C#
Description: Convert to PDF/TIFF and save it on the disk. Parameters: Description: Convert to PDF/TIFF and save it into stream. Parameters:
how to save pdf to tiff; pdf to tiff multipage
C# Create PDF from Word Library to convert docx, doc to PDF in C#.
Description: Convert to PDF/TIFF and save it on the disk. Parameters: Description: Convert to PDF/TIFF and save it into stream. Parameters:
pdf to tiff batch conversion; pdf to tiff conversion using
Scanning the child nodes in a tree calls for a recursive procedure, or a procedure that calls itself.
Think of a tree structure that contains all the files and folders on your C: drive. If this structure con-
tained no subfolders, you’d need to set up a loop to scan each folder, one after the other. Since most
folders contain subfolders, the process must be interrupted at each folder to scan the subfolders of
the current folder. The process of scanning a drive recursively was described in detail in Chapter 13.
Recursive Scanning
To start the scanning of the TreeView1 control, start at the top node of the control with the statement
Protected Sub bttnScanTree_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
ScanNode(GlobeTree.Nodes(0))
End Sub
This is the code behind the Scan Tree button, and it doesn’t get any simpler. It calls the Scan-
Node() subroutine to scan the child nodes of a specific node, which is passed to the subroutine as an
argument. 
GlobeTree.Nodes(0)
is the root node. By passing the root node to the ScanNode() sub-
routine, we’re in effect asking it to scan the entire tree.
This example assumes that the TreeView control contains a single root node and that all other
nodes are under the root node. If your control contains multiple root nodes, then you must set up a
small loop and call the ScanNode() subroutine once for each root node:
For Each node In GlobeTree.Nodes
ScanNode(node)
Next
Let’s look now at the ScanNode() subroutine, shown in Listing 16.11.
Listing 16.11: Scanning a Tree Recursively
Sub ScanNode(ByVal node As TreeNode)
Dim thisNode As TreeNode
Static IndentLevel As Integer
Application.DoEvents()
ListBox1.Items.Add(Space(IndentLevel) & node.Text)
If node.Nodes.Count > 0 Then
IndentLevel += 5
For Each thisNode In node.Nodes
ScanNode(thisNode)
Next
IndentLevel -= 5
End If
End Sub
This subroutine is deceptively simple. First, it adds the caption of the current node to the ListBox1
control. If this node (represented by the Nodevariable) contains child nodes, the code must scan them
all. The 
Node.Nodes.Count
method returns the number of nodes under the current node. If this value
767
THE TREEVIEW CONTROL
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
C# TIFF: How to Convert TIFF File to PDF Document in C# Project
doc = new TIFFDocument(@"demo1.tif"); if (null == doc) throw new Exception("Fail to load TIFF Document"); // Convert Tiff to PDF and save PDF as file.
online pdf to tiff; program to automatically convert pdf to tiff
C# TIFF: TIFF Editor SDK to Read & Manipulate TIFF File Using C#.
Excel/PPT/PDF/Jpeg to Tiff conversion. Tiff File Processing in C#. Refer to this online tutorial page, you will see: 1. Create, load, and save Tiff file using C#
pdf to tiff batch converter; convert pdf to single page tiff
is positive, then we scan all the items of the 
Node.Nodes
collection. To do this, the ScanNode() sub-
routine must call itself by passing a different argument. If you’re familiar with recursive procedures,
you’ll find the code quite simple. If not, this coding probably will raise many questions. You can use
the ScanNode() subroutine as is to scan any TreeView control. All you need is a reference to the root
node (or the node you want to scan recursively), which you must pass to the ScanNode() subroutine
as an argument. The subroutine will scan the entire subtree and display its nodes on a ListBox control.
The nodes will be printed one after the other. To make the list easier to read, indent the names of the
nodes by an amount that’s proportional to the levels of nesting. Nodes of the first level aren’t indented
at all. Nodes on the first level can be indented by 5 spaces, nodes on the second level can be indented by
10 spaces, and so on. The variable IndentLevelkeeps track of the level of nesting and is used to specify
the indentation of the corresponding node. It’s increased by 5 when we start scanning a new subordinate
node and decreased by the same amount when we return to the next level up. The IndentLevelvariable is
declared as Static so that it maintains its value between calls.
Run the TreeViewScan project and expand all nodes. Then click the Scan Tree button to populate
the list on the right with the names of the continents/countries/cities. Obviously, the ListBox control
is not a substitute for the TreeView control. The data have no particular structure; even when they’re
indented, there are no tree lines connecting its nodes, and users can’t expand and collapse the control’s
contents. So why bother to map the contents of the TreeView control to a ListBox control? The goal
was to demonstrate how to scan a tree structure and extract all the nodes along with their structure.
You can use the ScanNode() subroutine to store the nodes of a TreeView control to a disk file or
transfer them to a database or another control. The ScanNode() subroutine is the core of the subrou-
tine you need and can be adjusted to accommodate any of the operations just mentioned.
The ListView Control
The ListView control is similar to the ListBox control except that it can display its items in many
forms, along with any number of subitems for each item. To use the ListView control in your proj-
ect, place an instance of the control on a form and then sets its basic properties, which are described
in the following sections.
The View and Arrange properties There are two properties that determine how the various
items will be displayed on the control: the View property, which determines how the items will
appear, and the Arrange property, which determines how the items will be aligned on the con-
trol’s surface. The View property can have one of the values shown in Table 16.1.
Table 16.1:Settings of the View Property
Setting
Description
LargeIcon
(Default) Each item is represented by an icon and a caption below the icon.
SmallIcon
Each item is represented by a small icon and a caption that appears to the right of the icon.
List
Each item is represented by a caption.
Report
Each item is displayed in a column with its subitems in adjacent columns.
Chapter 16 THE TREEVIEW AND LISTVIEW CONTROLS
768
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
this RasterEdge XDoc.PDF SDK, you can simply delete a single page from a PDF document using VB.NET or remove any page from a PDF document and save to local
compare pdf to tiff; convert pdf to grayscale tiff
The Arrange property determines how the items will be arranged on the control, and its possible
settings are show in Table 16.2.
Table 16.2:Settings of the Arrange Property
Setting
Description
Default
When an item is moved on the control, it remains where it is dropped.
Left
Items are aligned to the left side of the
control.
SnapToGrid
Items are aligned to an invisible grid on the control. When the user moves an item, the item
moves to the closest grid point on the control.
Top
Items are aligned to the top of the control.
HeaderStyle This property determines the style of the headers in Report view. It has no mean-
ing when the View property is set to something else, because only the Report view has columns.
The possible settings for the HeaderStyle property are shown in Table 16.3.
Table 16.3:Settings of the HeaderStyle Property
Setting
Description
Clickable
Visible column header that responds to clicking
Nonclickable
Visible column header that does not respond to clicking
None
No visible column header
AllowColumnReorder This property is a True/False value that determines whether the user
can reorder the columns at runtime. If this property is set to True, then the user can move a col-
umn to a new location by dragging its header with the mouse and dropping it in the place of
another column. This property is also meaningful only in Report view.
Activation This property specifies the action that will activate an item on the control, and it
can have one of the values shown in Table 16.4.
Table 16.4:Settings of the Activation Property
Setting
Description
OneClick
Items are activated with a single click. When the cursor is over an item, it changes shape and
the color of the item’s text changes. 
Standard
Items are activated with a double-click. No change in the selected item’s text color takes
place. 
TwoClick
Items are activated with a double-click and their text changes color as well.
769
THE LISTVIEW CONTROL
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
FullRowSelect This property is a True/False value indicating whether the user can select an
entire row or just the item’s text, and it’s meaningful only in Report view.
GridLines Another True/False property. If True, then grid lines between items and subitems
are drawn. This property is meaningful only in Report view.
LabelEdit The LabelEditproperty lets you specify whether the user will be allowed to edit the
text of the items. The default value of this property is False.
MultiSelect A True/False value indicating whether the user can select multiple items on the
control or not. To select multiple items, click them with the mouse while holding down the Shift
or the Control key.
Scrollable A True/False value that determines whether the scrollbars are visible or not. Even if
the scrollbars are invisible, users will still be able to bring any item into view. All they have to do
is select an item and then press the arrow keys as many times as needed to scroll a different sec-
tion of the Items collection into view.
Sorting This property determines how the items will be sorted, and as usual it’s meaningful
only in Report view. This Sorting property isn’t a simple True/False value like the Sorted prop-
erty of the TreeView control. Its setting can be 
None
Ascending
, or 
Descending
. A ListView con-
trol can be sorted in many ways (it has multiple columns), and each column may hold data of a
different type. You must build a custom comparer and assign it to the ListViewItemSorter
property of the ListView control. The process of sorting a ListView control is discussed in detail
in the section “Sorting the ListView Control,” later in this chapter.
The Columns Collection
To display items in Report view, you must first set up the appropriate columns. The first column
corresponds to the item, and the following columns correspond to its subitems. If you don’t set up
at least one column, no items will be displayed in Report view. Conversely, the Columns collection
is meaningful only when the ListView control is used in Report view.
The items of the Columns collection are of the ColumnHeader type. The simplest method to set
up the appropriate columns is to do so at design time with a visual tool. Locate and select the Columns
property in the Properties window, and click the button with the ellipses next to it. The Column-
Header Collection Editor window will appear, as shown in Figure 16.11, where you can add and
edit the appropriate columns.
Adding columns to a ListView control and setting their properties through the window of 
Figure 16.11 is quite trivial. Don’t forget to size the columns according to the data you anticipate 
to store in them and set their headers.
It is also possible to manipulate the Columns collection from within your code, with the methods
and properties discussed here.
Add method Use the Add method of the Columns collection to add a new column to the con-
trol. The syntax of the Add method is
TreeView.Columns.Add(header, width, textAlign)
Chapter 16 THE TREEVIEW AND LISTVIEW CONTROLS
770
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
The headerargument is the column’s header (the string that appears on top of the items). The
widthargument is the column’s width in pixels, and the last argument determines how the text will
be aligned. The textAlignargument can be Center, Justify, Left, NotSet, or Right. The NotSet set-
ting specifies that horizontal alignment is not set.
The Add method returns a ColumnHeader object, which you can use later in your code to
manipulate the corresponding column. The ColumnHeader object exposes a Name property,
which can’t be set with the Add method.
Header1 = TreeView1.Add(“Column 1”, 60, ColAlignment.Left)
Header1.Name = “COL1”
After the execution of these statements, the first column can be accessed not only by index but by
name as well.
Clear method This method removes all columns.
Count property This property returns the number of columns in the ListView control. You
can add more subitems than there are columns in the control, but the excess subitems will not be
displayed.
Remove method This method removes a column by its index:
ListView1.Columns(3).Remove
The indices of the following columns are automatically decreased by one.
The ListItem Object
As with the TreeView control, the ListView control can be populated either at design time or at
runtime. To add items at design time, click the button with the ellipsis next to the ListItems prop-
erty in the Properties window. When the ListViewItem Collection Editor window pops up, you can
enter the items, including their subitems, as shown in Figure 16.12.
Figure 16.11
The ColumnHeader
Collection Editor
window
771
THE LISTVIEW CONTROL
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Click the Add button to add a new item. Each item has subitems, which you can specify as mem-
bers of the SubItems collection. To add an item with three subitems, you can populate the SubItems
collection with the appropriate elements. Click the button with the ellipsis in the SubItems property
on the ListViewItem Collection Editor, and the ListViewSubItem Collection Editor will appear.
This window is very similar to the ListViewItem Collection Editor window, and you can add each
item’s subitems. Assuming that you have added the item called Item 1 in the ListViewItem Collec-
tion Editor, you can add these subitems: Item 1-a, Item 1-b, and Item 1-c. The first subitem (the
one with zero index) is actually the main item of the control.
Notice that you can set other properties, like the color and font for each item, the check box in
front of the item that indicates whether the item is selected, and the image of the item. Use this win-
dow to experiment with the appearance of the control and the placement of the items, especially in
Report view, since subitems are visible only in this view. Even then, you won’t see anything unless
you specify headers for the columns.
Unlike the TreeView control, the ListView control allows you to specify a different appearance
for each item and each subitem. To set the appearance of the items, use the Font, BackColor, and
ForeColor properties of the ListViewItem object.
Almost all ListViews are populated at runtime. Not only that, but you should be able to add and
remove items during the course of the application. The items of the ListView control are of the
ListViewItem type, and they expose a number of members that allow you to control the appearance
of the items on the control. These members are listed next:
BackColor property This property sets or returns the background color of the current item.
Checked property This property controls the status of an item. If it’s True, then the item has
been selected. You can also select an item from within your code by setting its Checked property
to True. The check boxes in front of each item won’t be visible unless you set the control’s
CheckBoxes property to True.
Font property This property sets the font of the current item. Subitems can be displayed in a
different font if you specify one with the SetSubItemFont method (see the section “The
SubItems Collection,” later in this chapter).
Figure 16.12
The ListViewItem
Collection Editor
Chapter 16 THE TREEVIEW AND LISTVIEW CONTROLS
772
Copyright ©2002 SYBEX, Inc., Alameda, CA
www.sybex.com
Documents you may be interested
Documents you may be interested