Получаем выбранные строки DataGridView, в котором выбраны только ячейки

Есть DataGridView в котором выводится стандартная табличная информация. Нужно получить выбранные строки и/или список каких-то уникальных кодов для набора выбранных строк, что бы потом сотворить с ними что-то нехорошее. В теории существует специальное свойство DataGridView.SelectedRows, но оно работает только в том случае, если строки выбраны целиком. Если у вас выбраны ячейки (например из трех разных строк), это свойство будет пустым. Простой код с использованием свойства SelectedCells поможет решить эту проблему:

                List<int> rowIndexList = new List<int>();
                List<int> testIdList = new List<int>();
                foreach (DataGridViewCell currCell in _testDataGridView.SelectedCells)
                {
                    if (!rowIndexList.Contains(currCell.RowIndex))
                    {
                        rowIndexList.Add(currCell.RowIndex);
                        testIdList.Add(Convert.ToInt32( _testDataGridView.Rows[ currCell.RowIndex ].Cells["TEST_ID"].Value));
                    }
                }

Ошибка в коде привела к убыткам в 476 миллионов долларов и банкротству компании

Это, пожалуй, самый болезненный отчет об ошибке, который я когда-либо читал. Он красочно описывает шаги, которые привели к потере 465 миллионов долларов компанией Knight Capital в связи с ошибкой программного обеспечения, проявившейся в прошлом году и обанкротившей компанию

Для обеспечения участия своих клиентов в Программе ликвидности (ПЛ) на Нью-Йоркской фондовой бирже, запуск которой планировался 1 августа 2012 года, Knight внес ряд изменений в свои системы и программный код, связанный с процессом обработки заказов. Эти изменения включали в себя разработку и развертывание нового программного кода в SMARS. SMARS представляет собой автоматизированный, высокоскоростной, алгоритмический маршрутизатор, который отправляет заказы на рынок. Одна из основных функций SMARS — это получение заказов от других компонентов торговой платформы Knight («родительских» заказов), и, по мере необходимости на основе имеющейся ликвидности, отправка одного или нескольких представительских (или «дочерних») заказов внешним службам на исполнение.

Читать далее

Отслеживаем изменения выбранного значения в колонке ComboBox DataGridView (DataGridViewComboBoxColumn)

Задача: отловить изменение выбранного значения в колонке DataGridViewComboBoxColumn. Чтобы достучаться до сидящих в ячейках грида ComboBox надо использовать событие DataGridView.EditingControlShowing, из которого мы получим экземпляр класса DataGridViewEditingControlShowingEventArgs , свойство Control которого в свою очередь уже можно конвертировать в ComboBox. Событие может вызываться для всех ячеек и неоднократное, так что нам надо будет поверять, на какой именно столбец мы попадаем и перед записью обработчика в с полученный ComboBox сначала удалть его оттуда на тот случай, если мы уже записывали наш обработчик в данный комбо-бокс. Просто, понятно и интуитивно, не так ли?

        private void _testDataGridView_EditingControlShowing ( object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (_testDataGridView.CurrentCell.ColumnIndex == 1 ) // 1 - индекс колонки с комбо-боксами
            {
                ComboBox cellComboBox = (ComboBox) e.Control;
                if (cellComboBox != null)
                {
                    // обработчик уже мог записаться при предыдущем вызове этого события, так что удаляем
                    cellComboBox. SelectionChangeCommitted -= new EventHandler (cellComboBox_SelectionChangeCommitted); 
                    // и наконец записываем
                    cellComboBox.SelectionChangeCommitted += new EventHandler (cellComboBox_SelectionChangeCommitted); 
                }
            }
        }

Читать далее

Excel 2010, Windows 7, два монитора и "ошибка при направлении команды приложению"

По умолчанию Excel 2007/2010 не поддерживает работу с несколькими мониторами - все документы открываются только на одном. Чтобы разные документы можно было растаскивать по разным мониторам, надо поставить в настройках галку на параметр с интуитивно понятным названием "Игнорировать DDE-запросы от других приложений" - по крайне мере программистам Microsoft сразу понятно, что он говорит о работе с двумя мониторами.

Но в Windows 7 ни о чем не подозревающего пользователя поджидает еще более страшная засада - при попытке открыть файл Excel двойным кликом из проводника, Outlook, Total Commander вылетает ошибка с еще более понятным текстом "ошибка при направлении команды приложению" или "ошибка 29" в случае Total Commander. Официальный сайт Microsoft рекомендует снять искомую галочку. При этом Excel, чсх, перестает поддерживать много мониторов. Дело в том, что для отключения dde (это такая непонятная хрень, которая не дает использовать excel с двумя мониторами) просто поставить галочку. Что делать? Править реестр!
Читать далее

Удаляем default-ограничение (constraint) в Transact Sql

Сгенерировать sql код для удаления default-ограничения не зная его имени, но зная таблицу и колонку, можно следующей командой (вынесена в отдельную функцию):

create
 -- alter
function dbo.create_delete_default_command(@table_name varchar(256), @col_name varchar(256))
returns varchar(1000)
as
begin
declare @delete_command  varchar(1000)

select @delete_command = 'ALTER TABLE ' + @table_name + ' drop constraint ' + defcon.name
from sys.tables    
join    sys.default_constraints defcon on defcon.parent_object_id = sys.tables.object_id  
join    sys.columns as scol on scol.object_id = sys.tables.object_id  and scol.column_id = defcon.parent_column_id
where sys.tables.name = @table_name and scol.name = @col_name

return @delete_command
end 

Использование функции

select dbo.create_delete_default_command('TEST_TABLE', 'TEST_COLUMN')

В принципе можно удалять ограничение сразу

execute (@delete_command)

How to drop SQL default constraint without knowing its name?

Process.WaitForExit не ждет, a Process.Kill не убивает - удаление файла после завершения процесса

Задача: дождаться завершения работы процесса и удалить его файл. Это может понадобиться при работе системы автоматического обновления, перезаписывающей исполняемый файл или в иных ситуациях.

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

Примерный код. SimpleForm.exe здесь примитивная программа с одним окном, создаваемая студией по умолчанию для соответствующего типа проекта. При желании протестировать разные промежутки времени в нее можно добавить таймер, закрывающий приложение через пару секунд. Более сложные варианты могут включать в себя поиск существующего процесса по имени или коду.

            using System.Diagnostics;
            using System.IO;
            // какой-то код
            string directory = Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location );
            string path = directory  + "\\SimpleForm.exe";
            ProcessStartInfo processStartInfo = new ProcessStartInfo();
            processStartInfo.FileName = path;

            Process process = Process.Start(processStartInfo);
            process.Kill();
            //process.WaitForExit(2000);

            try
            {
                File.Delete(path);
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }

Читать далее

Самоучитель по C# для начинающих. 03. Ошибки, отладка, файлы программы, наследование, интерфейсы, библиотеки классов

3.1 Немного реального мира, программа вне среды разработки

Вопрос может показаться глупым опытным программистам - но где реально находится наша программа и как ее запустить вне среды разработки? В первой части мы выбрали каталог для проекта. Сама по себе программа по умолчанию и для проекта TestConsoleApplication будет находится в подкаталоге TestConsoleApplication\TestConsoleApplication\bin\Debug\TestConsoleApplication.exe и на данный момент состоять из одного-единственного файла TestConsoleApplication.exe. Его можно скопировать в другое место и запустить оттуда.

Итоговые файлы могут находиться и в другой папке, это зависит от конфигурации приложения.

c-sharp-guide-010

Более подробно о различиях в конфигурации можно прочить в официальной документации Microsoft.
Читать далее

Самоучитель по C# для начинающих. 02. Функции, классы, обьекты, коллекции

2.1 Функции.

Вернемся к старой задаче - выводе данных о людях. У нас есть разные люди с данными в виде отдельных фамилии, имени, отчества, которые надо вывести на экран - вида Пушкин Александр Сергеевич и Пушкин А.С. Чтобы задача была правдоподобней можно имитировать ввод данных пользователем или загрузку из внешнего источника, но все это будет пустой тратой времени - реальные приложения все равно работают с графическим и/или веб-интерфейсом. Просто держим в уме что в реальности людей не два, а две тысячи и заранее их имена не известны.

Получаем уродливый код

            string name = "Александр";
            string otchestvo = "Сергеевич"; 
            string surname = "Пушкин";


            string name2 = "Наталья";
            string otchestvo2 = "Николаевна";
            string surname2 = "Гончарова";

            System.Console.WriteLine(surname  + " " + name + " " + otchestvo);
            System.Console.WriteLine(surname2  + " " + name2 + " " + otchestvo2); 

            System.Console.ReadLine();

Два раза повторяется один и тот же кусок кода - склеивание трех строк в одну.
Два раза повторяется другой кусок кода - склеивание фамилии, первых букв имени и отчества, точек.
Читать далее

Самоучитель по C# для начинающих. 01. Основы языка, переменные, логика, циклы.

1.1 Начальные понятия

Данный самоучитель рассчитан на людей, совершенно не знакомых с программированием, но способных скачать, установить и запустить программу - в данном случае Visual Studio 2010 (2008,2012). В первой части я кратко расскажу о основах языка C#. Формат самоучителя подразумевает краткое и упрощенное изложение - за подробностями касательно отдельных функций и классов обращайтесь в гугл и msdn, за продвинутыми методиками программирования в продвинутые книги. В принципе почти всю информацию можно найти в интернете, надо лишь знать что искать, так что в отличие от классических книг на несколько сотен страниц я буду давать ту основу, зная которую вы уже сможете сформулировать поисковый запрос - ни в одном разделе я сознательно не даю полной и исчерпывающей информации, ее место в документации. Крайне желательно знать английский язык хотя бы на уровне чтения со словарем - в англоязычном интернете информации на порядок больше, невероятно полезные сайты вроде StackOverflow не имеют русских аналогов, а русскоязычные форумы и обсуждения чаще всего напоминают знаменитый анекдот (под американским форумом можно смело понимать англоязычный с немцами, индусами и бразильцами):

Чем отличаются русский, американский и еврейский форумы?
- на американском форуме вы задаете вопрос и вам дают ответ
- на еврейском форуме вы задаете вопрос и вам задают встречный вопрос
- на русском форуме вы задаете вопрос и вам долго объясняют почему вы такой мудак.

Читать далее

Выборка OleDb из хранимой процедуры возвращает пустой набор строк

Коллега столкнулся с проблемой, при попытке загрузить выборку из хранимой процедуры, с вызовом вида "exec some_procedure" ничего не выбирается, хотя через SQL Management Studio вопрос выполняется без проблем. Решение оказалось несколько неожиданным - в начале процедуры использовать SET NOCOUNT ON - эта инструкция отключает вывод сообщений о количестве обработанных строк.