Удаление строк из DataGridView с EditMode.EditOnEnter

По умолчанию редактирование в DataGridView весьма неинтуитивно, требует либо ввод чего-то либо нажатия F2 либо многократного кликания, но если мы переключимся на редактирование по клику, то столкнемся с совсем другой проблемой - невозможно выбрать всю строку, чтобы удалить ее из таблицы целиком (и в дальнейшем из базы через OleDbAdapter.DeleteCommand). Решить ее можно достаточно простой процедурой по клику на ячейке CellClick:

private void _someDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if(e.ColumnIndex == -1)
    {
        _someDataGridView.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
        _someDataGridView.EndEdit();
    }
    else if (_someDataGridView.EditMode != DataGridViewEditMode.EditOnEnter)
    {
        _someDataGridView.EditMode = DataGridViewEditMode.EditOnEnter;
        __someDataGridView.BeginEdit(false);
    }
}

DataGridView.Editmode = EditOnEnter. How to Select the row to Delete it?
DataGridViewEditMode Enumeration

OleDbDataAdapter, DataTable, пустая строка и ошибка Cannot insert the value NULL

В .Net существует очень простой способ вносить изменения в базу из таблицы, загруженной в DataGridView - использовать методы OleDbDataAdapter вроде Update. К сожалению, как и все коробочные решения данным способ построен по принципу "шаг вправо, шаг влево - расстрел". Если мы в базе для строковых полей вместо null храним значение по умолчанию в виде пустой строки not null default '', автоматическая связка из OleDbDataAdapter и DataTable в принципе не способна обработать такую комбинацию - так как вне зависимости от параметра DataColumn.DefaultValue (он работает только при добавлении новых строк) соответствующей колонки, при удалении всех данных в ячейке все равно окажется значение DBNull, которое DataAdapter и попытается записать в базу закономерно вылетев с ошибкой Cannot insert the value NULL ... column does not allow nulls.

Нормального выхода из этой ситуации нет, можно только вручную заменить все значения DBNull в Datatable на пустую строку

foreach (DataRow currRow in _someTable.Rows)
{
    if (currRow["STRING_COLUMN1"] == DBNull.Value) { currRow["STRING_COLUMN1"] = ""; }
    if (currRow["STRING_COLUMN2"] == DBNull.Value) { currRow["STRING_COLUMN2"] = ""; }
}

или таки написать собственную функцию обновления таблицы в обход DataAdapter

save Datatable values as empty string instead of null

Как проверить, существует ли логин, роль и пользователь базы в MS SQL Server

Задача: проверить, есть ли на сервере соответствующий серверный логин, роль на уровне базы данных, пользователь на уровне базы данных и создать в случае отсуствия. Решение приводится для MS SQL Server 2005 и выше.

Существование серверного логина

 
declare @user_name_db varchar(50), @password varchar(30), @sql_statement nvarchar(1000), @error_message varchar(1000)

set @user_name_db = 'a.s.pushkin'
set @password = 'pamyatnik'
if not exists (select name from sys.server_principals  where type = 'S' and name = @user_name_db)
begin
 select @sql_statement = 'CREATE LOGIN "' + @user_name_db + '" WITH PASSWORD = ''' + @password+ ''', CHECK_POLICY = OFF'
 exec sp_executesql @sql_statement 
end

Читать далее

Как прочитать db3/dbf/dbase из C#

Одна из особенностей работы в корпоративной среде - необходимость работы с древними как шерстистые носороги форматами. На самом деле для промышленных систем не особо нужен даже графический интерфейс, не говоря уже о более новых технологиях - на некоторых предприятиях до сих пор отлично работаю текстовые программы под DOS. Но это все лирика, а сегодняшняя заметка будет кратка до неприличия и посвящена формату dBase III , который тоже много где используется по сей день.

Гугление на тему чтения этого формата из .Net приложения дает какие-то невнятные результаты и провоцирует на изобретение чего-то хитрого, мудреного и очень красивого (даже на Stackoverflow нет одобренного ответа). Хотя на самом деле задача решается очень простым и тупым способом, который по непонятным причинам не приходит на ум в первую очередь - читать db3 файлы из C# можно с помощью Excel. Все проще некуда - открываем файл в Excel прямо из кода и читаем как обычнейшую таблицу. Можно использовать для этого описанный чуть раньше класс для работы с Excel, никаких премудростей не понадобится - несколько строчек кода и полная свобода действий.

Работа с Excel из C# через COM Interop, часть 3, чтение данных

В предыдущей статье я рассмотрел простую запись данных в документ Excel. Теперь настала пора чтения. Само собой мы можем прочитать данные из ячейки по индексу, но из какой именно? Кроме простого чтения нам необходимо знать, какая часть документа заполнена данными.

При чтении значения надо учесть, что внутри ячейки сидит Object, который надо самостоятельно конвертировать в Range, при этом содержимое ячейки может быть null.

// ЧТЕНИЕ ЗНАЧЕНИЯ
public string GetCellValue(int rowIndex, int columnIndex)
{
    string cellValue = "";

    Excel.Range cellRange = (Excel.Range) _workSheet.Cells[rowIndex, columnIndex];
    if (cellRange.Value != null)
    {
        cellValue = cellRange.Value.ToString();
    }
    return cellValue;
}

Для получения количества строк и столбцов с данными можно использовать следующий код
Читать далее

Как полностью закрыть Excel, вызванный из C# Interop

Работа c Excel в C# похожа на работу с Word, но вот выход закрытие используемого в коде приложения осуществляется несколько более сложным образом:

_workBook.Close(false, _missingObj, _missingObj);

_application.Quit();

System.Runtime.InteropServices.Marshal. ReleaseComObject (_application);
           
_application = null;
_workBook = null;
_workSheet = null;

System.GC.Collect();

предполагая, что
Читать далее

Программы простые и сложные

Есть два способа спроектировать систему. Один — сделать ее настолько простой, что в ней очевидно не будет недостатков, а второй — сделать ее настолько сложной, что в ней не будет очевидных недостатков. Первый способ намного более труден.

Тони Хоар

Выполняем операцию для каждой строки в выборке Transact SQL

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

select @sum_string =  @sum_string 
 +  case when INT_FIELD = 0 then '0' else  '1' end 
 +  ',' 
from SOME_TABLE

-- если INT_FIELD будет примерно таким 6000, 6, 0, 2100, 11000, 1, 0 то мы получим строку вида 1,1, 0, 1, 1, 1, 0
-- которую можно проанализировать банальной строковой функцией
-- само собой можно использовать этот метод для склейки всех значений колонки выборки в одну строку

declare @has_triple_not_zero int
set  @has_triple_not_zero = 0;

if @sum_string like '%1,1,1%'
begin
 set @has_triple_not_zero = 1
end

Совершенный код. 3. Методы.

Разумные причины создания методов:

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

Не следует бояться создания простых методов в 2-3 строки. Во-первых такой код может повторяться десятки раз, во-вторых при дальнейших изменениях его размер может резко увеличиться.

Важнейшим принципом проектирования методов является связность - соответствие выполняемых в методе операций единой цели. Например связность метода Cosine() (косинус) крайне высока, у метода CosineAndTan() (косинус и тангенс) она гораздо хуже. Каждый метод должен выполнять только одну задачу - это функциональная связность, самая важная и эффективная.
Читать далее

Как раскрасить строки (изменить цвет текста) в ComboBox (C# и WinForms)

Имеется комбо-бокс, связанный с источником данных. Задача: раскрасить строки в разные цвета по какому-то критерию, связанному с источником данных.

Чтобы решить эту задачу придется изменить отрисовку на экране строк комбо-бокса повесившись на событие DrawItem. По умолчанию это событие не происходит, чтобы оно начало работать надо поставить свойство ComboBox DrawMode в значение OwnerDrawVariable или OwnerDrawFixed из перечисления DrawMode

Если наш комбо-бокс заполнен простым массивом или списком строк и не привязан к сложному источнику данных с DisplayMember и ValueMember, то код раскраски внутри события (в зависимости от строки) будет примерно таким
Читать далее