Создаем собственное событие в C#

Задача: создать событие в своем классе, на которое можно подписаться извне и которое будет происходить при определенных условиях.

Для решения задачи надо внутри класса описать само событие с использованием ключевого слова event, задать делегат (проще говоря шаблон) функции-обработчика, по которому такие функции будут создаваться во внешнем коде. При желании можно еще создать собственный класс аргументов события, тех данных, которые будут передаваться к подписанной на событие функции. Если желания нет, можно использовать стандартный класс EventArgs, описывающий по сути дела пустое событие без аргументов. Если желание есть, придется наследоваться от этого класса.

Итак, мы пишем компьютерную игру. В игре есть персонаж-герой, у него есть жизнь, измеряемая числом от 1 до 100. В результате сражений жизнь может изменяться. При изменении жизни надо обновлять число на экране, если жизнь становится меньше 20, выводить предупреждение.

public class Hero
{

// описание события
public event HealthChangedHandler HealthChanged;  

// делегат для подписывающихся на событие обработчиков 
public delegate void HealthChangedHandler(object sender, EventArgs eventArgs);

private int _health = 100;
public int Health 
{
	get
	{
		return _health;
	}
	set
	{
		_health = value;
		// если на событие не подписан ни один обработчик, здесь будет null 
		if (HealthChanged != null)
		{
			EventArgs eventArgs = new EventArgs();
			HealthChanged(this, eventArgs);
		}
	}
}

}

предположим, что игра происходит в окне Windows Forms (в жизни бывает еще и не такое) c текстовой меткой _heroHealthLabel и кнопкой _damageHeroButton
EventTest
Читать далее

C#, WinForms, используем перечисление (enumeration) как источник данных для ComboBox

Пример перечисления

public enum Gender    {  Female = 0, Male = 1, Unknown = 2  }

Возможно несколько вариантов подцепления его к комбо-боксу, в данном случае создам полноценный комбобокс с ValueMember и DisplayMember с которым можно использовать привычный код, но в оба поля положу строковое имя. При желании использовать числовые коды для Value можно просто изменить его привязку:

_genderComboBox.DataSource = Enum.GetValues(typeof(Gender))
    .Cast<Gender>()
    .Select(p => new { Name = Enum.GetName(typeof(Gender), p), Value = (int)p })
    .ToList();

_genderComboBox.DisplayMember = "Name";
_genderComboBox.ValueMember = "Name";

Проставление SelectedMember по перечислению делается так:
Читать далее

Создание всплывающей подсказки ToolTip для кнопки (и других управляторов)

private void createToolTip (Control controlForToolTip, string toolTipText)
{
	ToolTip toolTip = new ToolTip();
	toolTip.Active = true;
	toolTip.SetToolTip( controlForToolTip, toolTipText );
	toolTip.IsBalloon = true;
}

использование

createToolTip( _myButton, "Подсказка для кнопки _myButton"); 

Ссылка на подсказку сохраняется, создавать отдельную переменную на уровне формы не надо. Так же можно создать подсказки в дизайнере.

C#: How do I add a ToolTip to a control?
How can I display a tooltip over a button using Winforms?

Работа с файлом конфигурации (configuration) в C# - читаем и сохраняем

Простейший файл конфигурации создается через интерфейс студии (Решение - добавить элемент) и имеет следующую структуру.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="server" value="SOME_SERVER_NAME" />
    <add key="database" value="SOME_DATABASE_NAME" />
  </appSettings>
</configuration>

По умолчанию в проекте он виден как App.config, в папке с программой как Имя_исполняемого_файла.exe.config. При отладке Visual Studio создает копии исполняемого файла и файла конфигурации, так что запись в конфиг работать не будет. Точнее говоря конфиг будет сбрасываться при каждом запуске.
Читать далее

Раскраска DataGridView, выключение ячейки в WinForms

Задача: в процессе выполнения программы раскрашивать отдельные ячейки грида и включать-выключать в зависимости от различных параметров.

Color disabledCellColor = Color.FromArgb(245, 245, 245);
foreach (DataGridViewRow currDGVRow in _someDataGridView.Rows)
{
	string someInfo = Convert.ToString( currDGVRow.Cells["SOME_INFO"].Value);
	if (someInfo != "")
	{
		currDGVRow.Cells["CHECKED"].ReadOnly = true;
		currDGVRow.Cells["CHECKED"].Style.BackColor = disabledCellColor;
	}

	int someId = Convert.ToInt32( currDGVRow.Cells["SOME_ID"].Value );
	if (someId > 100 )
	{
		currDGVRow.Cells["SOME_NUMBER"].ReadOnly = true;
		currDGVRow.Cells["SOME_NUMBER"].Style.BackColor = disabledCellColor;
		// вариант для раскраски всей строки
		currDGVRow.DefaultCellStyle.BackColor = disabledCellColor;
	}
}

Кроме достаточно простого кода раскраски и выключения надо внимательно отнестись к вызовам раскраски - грид может перерисовываться в различных ситуациях, например если форма вызывается через ShowDialog, раскраску надо вешать на изменение видимости формы VisibleChanged. Так же грид перерисовывается при сортировке - Sorted. Если форма может менять размер, то перерисовку надо повесить на ее событие Shown.

Enabling and Disabling a cell in a Datagridview

IIS 7.5 Manager, отсутствует пункт Import Application

Начиная с Visual Studio 2010 для установки сайта или веб-сервиса на сервер можно использовать функцию создания deployment package (пакета веб-развертывания) - zip-архива с сайтом, который достаточно записать на сервер и установить одним кликом. Начинающий разрабтчик может столкнуться с досадной неприятностью - пункта Import Application в IIS Manager просто нет!

IIS Import Package

На самом деле все просто, из каких-то загадочных соображений Microsoft не включила этот пункт в установку по умолчанию. Компонент Web Deploy нужно самостоятельно скачать с сайта Microsoft и установить на сервер.

IIS 7.5 Missing Import Application – Deployment

ASP .Net MVC, Windows XP и ошибка Failed to initialize PowerShell host

Ошибка вылетает на машинах с Windows XP, при попытке создать проект на ASP .Net MVC 4 в Visual Studio 2010. Причина в старой версии PowerShell - в Windows XP при всех обновлениях остается версия 1.0, а студия хочет 2.0 (3.0 на XP не встанет). Обновить PowerShell не так просто, как кажется.

1. Скачать PowerShell 2.0 (а точнее говоря Windows Management Framework ) можно с официального сайта Microsoft, но при установке он вылетит с другой ошибкой "your system contains incompatible version of PowerShell or WinRm

2. Чтобы удалить PowerShell 1.0, надо зайти у "Установку и удаление" и поставить галку "Показать обновления", причем внутри обновлений PowerShell 1.0 может быть как под своим именем так и под кодом KB926139 (английское) / KB926140 (локализованное)

Как сделать текст жирным и изменить другие параметры текста на кнопке WinForms

Задача: изменить параметры шрифта на управляторе WinForms из кода во время выполнения программы. Просто изменить свойства не получится, надо создать новый экземпляр шрифта с неочевидным конструктором:

someButton.Font = new Font(someButton.Font, FontStyle.Bold);

How do I set a textbox's text to bold at run time?
Font Class
FontStyle Enumeration