private void InitializeComponent() {
…
//
// tooManyCharactersErrorProvider
//
this.tooManyCharaсtersErrorProvider.BlinkRate = 500;
this.tooManyCharactersErrorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.AlwaysBlink;
this.tooManyCharactersErrorProvider.ContainerControl = this;
}
После настройки внешнего вида ErrorProvider вы должны выполнить привязку ошибки к TextBox в контексте обработчика события Validating, как показано ниже.
private void txtInput_Validating(object sender, CancelEventArgs е) {
// Длина текста меньше 5?
if (txtInput.Text.Length › 5) {
errorProvider1.SetError(txtInput, "Больше 5 нельзя!");
} else // Все в порядке, не показывать ничего.
errorProvider1.SetError(txtInput, ");
}
Элементы управления TreeView очень полезны тем, что они позволяют визуально отображать иерархии данных (например, структуру каталогов или любую другую структуру, связанную отношением "родитель-потомок"). Элемент управления TreeView предлагает очень широкие возможности настройки. При желании вы можете добавить пользовательские изображения, задать цвет узлов, элементы контроля узла и другие визуальные усовершенствования. (Заинтересованным читателям за дополнительной информацией об этом элементе управления предлагается обратиться к документации .NET Framework 2.0 SDK.)
Чтобы продемонстрировать основные возможности использования TreeView, на следующей странице вашего TabControl мы программно разместим элемент TreeView, определяющий ряд узлов наивысшего уровня, представляющих набор типов Car (автомобиль), Каждый узел Car имеет два подчиненных узла, представляющих текущую скорость автомобиля и любимую радиостанцию водителя. На рис. 21.22 обратите внимание на то, что выбранный элемент выделен подсветкой. Также заметьте, что в области элемента Label кроме выбранного узла отображаются имена родительского и следующего узлов (если последние имеются).
Рис. 21.22. Элемент TreeView в действии
Предполагая, что соответствующий пользовательский интерфейс скомпонован из элементов управления TreeView (с именем treeViewCars) и Label (с именем lblNodeInfo), добавьте в свой проект ExoticControls новый файл C#, который моделирует тривиальный типа Car, имеющий Radio.
namespace ExoticControls {
class Car {
public Car(string pn, int cs) {
petName = pn;
currSp = cs;
}
public string petName;
public int currSp;
public Radio r;
}
class Radio {
public double favoriteStation;
public Radio(double station) { favoriteStation = station; }
}
}
Производный от Form тип будет поддерживать обобщенный тип List‹› (с именем listCars), содержащий 100 типов Car, которые будут занесены в список в конструкторе типа MainForm, заданном по умолчанию. Кроме того, этот конструктор вызывает новый вспомогательный метод BuildCarTreeView(), который не имеет никаких аргументов и возвращает void. Вот соответствующая модификация программного кода.
public partial class MainWindow: Form {
// Создание нового List для хранения объектов Car.
private List‹Car› listCars = new List‹Car›();
public MainWindow() {
…
// Заполнение ячеек List‹› и построение TreeView.
double offset = 0.5;
for (int x = 0; x ‹ 100; x++) {
listCars.Add(new Car(string.Format("Car {0}", x) , 10 + x));
offset += 0.5;
listCars[x].r = new Radio(89.0 + offset);
}
BuildCarTreeView();
}
…
}
Обратите внимание на то, что petName каждого автомобиля задается на основе текущего значений x (Car 0, Car 1, Car 2 и т.д.). Текущая скорость образуется путем сдвига x на 10 (от 10 км/ч до 109 км/ч), а любимая радиостанция задается сдвигом от начального значения 89.0 на 0.5 (90, 90.5, 91, 91.5 и т.д.).
Итак, у вас есть список Car, и вам нужно спроецировать эти значения на узлы элемента управления TreeView. Здесь самое важное – понять, что каждый узел, как высшего уровня, так и подчиненного, представляется объектом System. Windows.Forms.TreeNode, полученным непосредственно из MarshalByRefObject. Вот некоторые интересные свойства TreeNode.
public class TreeNode: MarshalByRefObject, ICloneable, ISerializable {
…
public Color BackColor { get; set; }
public bool Checked { get; set; }
public virtual ContextMenu ContextMenu { get; set; }
public virtual ContextMenuStrip ContextMenuStrip { get; set; }
public Color ForeColor { get; set; }
public int ImageIndex { get; set; }
public bool IsExpanded { get; }
public bool IsSelected { get; }
public bool IsVisible { get; }
public string Name { get; set; }
public TreeNode NextNode { get; }
Читать дальше