На вновь созданном наборе выбираем Add>Tool:
В следующем окне в ArcToolbox ищем нашу любимую программку (Copy Features в нашем примере) и жмём OK:
Всё. Теперь самые ходовые утилиты у нас всегда под рукой и больше нет необходимости каждый раз рыскать по всем веткам в ArcToolbox’е в поисках нужной:
31.03.2014
8. Чаще пользуйтесь Поиском!
Если вы помните название нужной утилиты, но подзабыли, где она находиться в ArcToolbox‘е — не теряйте время и смело жмите Ctrl+F. В панели поиска (Search) останется только ввести название нужного инструмента. Так получиться гораздо быстрее:
01.04.2014
Настройте
ArcGIS
под себя!
У каждого пользователя есть свои предпочтения и своя специфика выполняемых задач. По возможности, настройте интерфейс ArcGIS под те задачи, что наиболее часто вам приходиться решать. Предположим, что на своём рабочем месте вы изо дня в день занимаетесь обработкой растра. Имеет смысл вытащить кнопку вызова Image Analysis в панель инструментов. Это можно сделать сл. образом. Идём меню Customize(Настройка)>Customize Mode … :
… переходим на вкладку Commands и далее просто вытягиваем мышкой нужную иконку в Панель инструментов:
Теперь нужная кнопка у вас всегда будет под рукой!
04.04.2014
10
.
Пользуйтесь пакетной обработкой!
Довольно часто приходиться монотонно применять один и тот же инструмент для различных наборов данных. Но не все даже искушенные пользователи ArcGIS знают, что для таких манипуляций есть возможность выполнять их в пакетном режиме. Для этого достаточно выбрать соотв. утилиту и нажать в контекстном меню Batch (Пакетно):
Тогда, например, для пакетного переименования наборов данных вид утилиты Copy Features , будет выглядеть так (кстати сказать, в этом случае Совет 3 становиться особенно актуальным):
07.04.2014
11. Пользуйтесь опциями
AutoHide
для панелей !
Для рационального использования пространства окна представления карты есть возможность автоскрытия панелей (особенно это актуально для Таблицы содержания, как наиболее часто загруженной):
Тогда, для скрытия панели достаточно немного задержать карту при её перемещении на заголовке панели (Таблицы содержания для нашего примера) :
Аналогичного эффекта можно добиться нажав клавишу Esc (естественно, в случае если панель находиться в фокусе)
07.04.2014
12. Работайте с Группой слоёв !
При работе с несколькими наборами данных одной логики, имеет смысл объединять их в Группы. Особенно это бывает удобно при работе с векторными слоями, если они представлены в виде нарезки с листов стандартной топографической разграфки.
Для создания группы выделяем придерживая Ctrl нужные наборы данных, и затем в контекстном меню по правой кнопке выбираем Group :
Далее созданную группу логично сохранить для дальнейшей работы в виде набора .lyr — меню Save As Layer File:
Более подробно о создании группы слоев можно посмотреть вот здесь
28.04.2014
13. Запомните и используйте клавиши быстрого доступа !
Не все даже опытные пользователи ArcGIS применяют в своей работе горячие клавиши. А напрасно. Многие манипуляции можно совершать гораздо быстрее (особенно при продолжительной, интенсивной работе), если запомнить хотя бы основные клавиши быстрого доступа к наиболее часто используемым функциям. Во всяком случае, приведенным ниже списком должен владеть, по-видимому, как отче наш, любой мало-мальски грамотный пользователь ArcGIS
№ |
Действие |
Горячая клавиша |
1 |
Показать карту (экстент) полностью |
Insert |
2 |
Перейти ( переместить фокус) к таблице содержания |
F3 |
3 |
Перейти (поменять фокус) в окно представления карты |
Esc |
4 |
Отключить/включить все слои |
Ctrl+
Пробел |
5 |
Перерисовать (обновить) карту |
F5 |
6 |
Выбрать Окно свойств набора данных в таблице содержания |
Enter |
7 |
Переименовать объект в таблице содержания |
F2 |
8 |
Переключиться между Увеличить/Уменьшить на карте |
F6 |
9 |
Перейти к предыдущему/следующему виду карты |
|
10 |
Завершить скетч (при оцифровке объектов) |
F2 |
11 |
Откат последних изменений при оцифровке объектов |
Ctrl+Z |
12 |
Удалить скетч |
Ctrl+Delete |
Понятное дело, перечень клавиш в ArcGIS гораздо шире, но даже использование и этого небольшого списка поможет вам тратить на себя любимого времени чуть больше 🙂
30.04.2014
Продолжение следует …
{
return true;
}
else
{
return false;
}
}
… можно написать такой простой код:
public
static bool TruOrFls(int i)
{
return (i > 0);
}
2. Для определения, является ли целое число чётным или нечётным, можно использовать сл. метод:
public static bool IsNechet(int i)
{
int result;
Math.DivRem(i, 2, out result);
return (result==1);
}
3. Простой класс для Шаблона «Одиночка» (Singleton) для создания форм:
namespace
MySpace
{
public static class SingletonForm
{
private static Dictionary forms = new Dictionary();
public static Form ShowInstance(Type t)
{
if (!forms.ContainsKey(t)) {
Form f = (Form)Activator.CreateInstance(t);
f.Disposed += new EventHandler(f_Disposed);
forms.Add(t, f);
}
forms[t].Show();
forms[t].Activate();
return forms[t];
}
static void f_Disposed(object sender, EventArgs e)
{
forms.Remove(sender.GetType());
}
}
}
Пример использования:
public void btnsprTIP_Click(System.Object sender, System.EventArgs e)
{
SingletonForm.ShowInstance(typeof(frmMyForm));
}
4. Для «отлавливания» неверно введённого символа в сетке(DataGridView) можно использовать событие DataError:
public
void MyDtg_DataError(object sender, DataGridViewDataErrorEventArgs anError)
{
int ColIndx = (int)anError.ColumnIndex;
string ColHT = MyDtg.Columns[ColIndx].HeaderText;
Utils.Mess(» » + ColHT + » !»);
MyDtg.CurrentCell.ErrorText = » » + ColHT;
}
5. Помещайте формы, классы, отчёты и т д. проекта в соответствующие подкаталоги с именами, например, FRM, CLS, RPT и т.д. Такая систематизация существенно облегчит вашу жизнь при работе с большими проектами. Мешанина из классов, форм, отчётов и пр. в одном подкаталоге вряд ли пойдёт на пользу качеству вашего проекта.
6. Если нужно постоянно обращаться к какому-то объекту ( или что-то возвращать из метода без передачи параметра внутрь его), то такую функцию удобно осуществлять с помощью аксессора get. Например, сл. код возвращает текущую строку в DataGrid View:
public DataGridViewRow GetCurrentRowOb
{
get {return this.MyDtg.CurrentRow;}
}
К такому методу можно обращаться просто как к переменной.
7. Вы можете назначить свою обработку какого-либо события в конструкторе сл. образом:
public frmMain()
{
InitializeComponent();
/*Альтернативная обработка события */
this.txtHr.KeyPress += new KeyPressEventHandler(this.ObrabKey);
}
В приведённом примере назначаем метод обработки ObrabKey событию KeyPress
8. Технология LINQ может существенно сократить количество ваших клацаний по клавиатуре. Например сл. код возвращает отсортированный массива:
public static string[] GetStr
{
// …
get
{
string[] ar = new string {«one», «two», «three», … «nine»);
};
return ar;
}
/
*Сортируем массив
…
*/
public static IEnumerable SortedList
{
get
{
IEnumerable sort = GetStr.OrderBy(a => a.j);
return sort;
}
}
9. Несложные классы (особенно если используется их большое количество экземпляров) лучше оформлять в виде структур — ключевое слово struct. Структура, в отличии от класса, является значимым типом. Экономия ресурсов, в этом случае, может оказаться весьма существенной.
10. Довольно часто приходиться итерировать объекты, которые не поддерживают интерфейс IEnumarable. Чтобы избежать это ограничение, существует специальная конструкция — yeild. Ниже приведён пример, как можно проитерировать коллекцию упр. элементы на главной форме:
class
Num : IEnumerable
{
frmMain MyF = GlobalVar.MainForm;
public System.Collections.IEnumerator GetEnumerator()
{
yield return MyF.Panel1;
yield return MyF.Panel2;
yield return MyF.Panel3;
yield return MyF.panel6;
yield return MyF.GroupBox1;
yield return MyF.groupBox2;
yield return MyF.GroupBox3;
yield return MyF.TableLayoutPanel1;
yield return MyF.pictureBox1;
}
Вот теперь можно пробежаться в цикле -применение в вызывающей стороне:
foreach
(Control cob in new Num())
{
cob.Anchor = AnchorStyles.Right;
}
11. Использование конструкции using ( …) { … } гарантирует применение метода .Dispose() — освобождение объекта , например:
using (SqlCommand cmd = new SqlCommand(strSQL, GlobalVar.conn))
{
//
Здесь что-то делаем с объектом
cmd …
}
// Это нужно делать, если не использовать using (…) { }
// cmd.Dispose();
12. При работе с базами данных обязательно напишите класс с методами создания соединения с БД и его тестированием, что-то вроде этого:
static class clsConn
{
// Создание соединения …
public static void CreateConn(string strmydir)
{
try
{
GlobalVar.conn = new SqlConnection(ConnectStringBuild);
GlobalVar.conn.Open();
}
catch (Exception)
{
Utils.Mess(» Ошибка!»);
}
}
// Тестирование соединения …
public static bool TestConn
{
get
{
try
{
using (SqlConnection testconn = new SqlConnection(ConnectStringBuild))
{
testconn.Open();
return (testconn.State == ConnectionState.Open);
}
}
// …
catch (SqlException)
{
return false;
}
catch (InvalidOperationException)
{
return false;
}
}
}
// Создание строки подключения к БД …
public static string ConnectStringBuild
{
get
{
string s = «Data Source=» + My.Settings.Default.ServerName + @»» + My.Settings.Default.SQLServerName + «;»;
return @s += «Initial Catalog=» + My.Settings.Default.BaseName + «;Integrated Security=True»;
}
}
13. Включите обработку ошибок в стартовый модуль вашей программы. Выше него ошибка «не поднимется»( выше только Господь Бог :-). Что-то вроде этого:
sealed
class mdlMain
{
[STAThread]
public static void Main(string[] args)
{
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
GlobalVar.MainForm = new frmMain();
Application.Run(GlobalVar.MainForm);
}
catch (ArgumentNullException ane)
{
MessageBox.Show(ane.Message, » Main-ArgumentNullException»);
}
catch (FormatException fex)
{
MessageBox.Show(fex.Message, » Main-FormatException»);
}
catch (NullReferenceException nre)
{
MessageBox.Show(nre.Message, » Main-NullReferenceException»);
}
catch (InvalidCastException ice)
{
MessageBox.Show(ice.Message, » Main-InvalidCastException»);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message , » o Main»);
}
}
}
14. Если в программе постоянно приходиться обрабатывать неизменяемый массив строк, то инициализацию такого массива очень удобно оформить с помощью аксессора get (см. Совет 6), что-то вроде этого:
private
static string[] GetStringArr
{
get
{
string[] ars = new string[] {
«one » ,
«two «,
«three «,
…
«nine «
};
return ars;
}
}
Тогда подсчитать, например, количество элементов в массиве очень просто:
int RecCount1 = GetStringArr.Count();
Или, обращение к j-му элементу массива:
string s = GetStringArr[j-1];
15. Довольно часто в коде нужно контролировать — является ли значение пустым, и вернуть, ну допустим, значение нуль для типа float. Осуществить такую проверку можно с помощью такого нехитрого метода:
public static float CheckIt(object par)
{
return (Convert.ToSingle(Convert.IsDBNull(par) ? 0 : par));
}
16. Если нужно знать, в каком столбце сетки DataGridView пользователь завершил редактирование ячейки, то можно использовать событие _CellEndEdit:
public
void MyDtg_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// Узнаём имя столбца …
string ColName = MyDtg.Columns[e.ColumnIndex].Name;
try
{
switch (ColName)
{
case(«Col1»):
/* Здесь что-то делаем … */
break;
case(«Col2»):
// …
break;
case(«Col3»):
}
}
17. Чтобы ‘пробежаться’ по всем контролам в панели, и отловить, ну скажем, метки (Label) можно использовать такой код:
foreach (Control cob in this.panel
1
.Controls)
{
if (cob is Label)
{
/* Здесь что-то делаем с контролом типа Label */
}
}
18. К строковой переменной можно смело «приклеивать» целочисленные переменные. Среда CLR поймёт такое преобразование без метода ToString(). Это особенно бывает удобно при формировании SQL-запросов в виде строк, что-то вроде этого:
int i=0;
string
sSQL=»Update Itogi SET Area=@area where kod=» + (i + 1);
19. ‘Склеивать’ строки лучше специально созданным для этого методом Concat для переменных типа string:
string s1 = «one»;
string s2 = «two»;
string s3 = «three»;
// Можно делать так:
string sAll = s1+s2+s3;
// … но грамотнее так:
string sAll = string.Concat(s1,s2,s3);
20. Программисты как-то недооценивают удобство метода Format для строк при формировании SQL-запросов . Например, вместо того, чтобы писать что-то вроде этого:
//
Можно делать так
:
string strUpdate = «Update Customers SET Balance=@Balance Where CustID=» +ID +» and SocialID=» + SocID;
… лучше написать такой код:
// Грамотнее так:
string strUpdate = «Update Customers SET Balance=@Balance Where CustID=»;
string strSQLUpdate = string.Format(«{0}{1} and SocialID={2}», strUpdate, ID, SocID);
21. Иногда бывает нужно узнать индекс элемента в массиве, ну например, в цикле foreach. Сделать это можно сл. образом:
// Есть массив строк …
private
static string[] GetStr
{
get
{
string[] ars = new string[] {
«one » ,
«two «,
«three «,
…
«nine «
};
return ars;
}
}
//В вызывающей стороне:
// Конечно, можно использовать счётчик …
int counter = -1;
foreach (string s in GetStr)
{
++counter;
…
}
// … но изящнее так :
private static void Sub()
{
foreach (string s in GetStr)
{
//Узнаём индекс элемента s в массиве …
int i = Array.IndexOf(GetStr, s);
…
}
}
22. Везде, где можно, предпочтительнее использовать типизированные коллекции, вместо классических массивов. Основные преимущества такого подхода заключаются в двух фактах: во-первых, коллекции позволяют не заботиться о контроле за выходом индекса за установленный размер (пресловутое Index Out of Range), а во-вторых, в них можно хранить (в отличии от нетипизированных списков) элементы одного типа. Итак, вместо использования скажем:
string[] ars = new string[6];
… предпочтительнее использовать типизированный список List:
List ars = new List();
Небольшая ремарка. Вообще, на мой взгляд, в связи с появлением начиная , по-моему, с .NET Framework 2.0 типизированных коллекций, классические массивы можно считать коллекциями устаревшего типа по причинам, указанным выше
23. Если в метод надо передавать много-много всяких входных параметров, то вместо такого «баяна» предпочтительнее передавать структуру.
Например, вместо использования некоего метода XYZ
static void XYZ(int a, int b,int c, string d, string e)
.
.. можно сначала определить структуру:
struct ABC
{
public int a,b,c;
public string d,e;
public ABC (int _a, int _b, int _c, string _d, string _e)
{
a=_a; b=_b; c=_c; d=_d; e=_e;
}
}
… а затем передавать её в метод :
static void XYZ(ABC mystru)
Вызов такого метода станет гораздо более изящным:
/*
Определяем экземпляр структуры
ABC */
ABC MyStru = new ABC (1,2,3,»one», «two»);
/*Вызываем метод
XYZ */
XYZ(MyStru);
24. Довольно часто программисты пользуются методом Parse для конвертации строковых величин в другие типы, что-то вроде этого:
int j= int.Parse (MyVal.ToString());
Однако, в случае неудачи такой метод выбросит исключение. Для написания устойчивого кода предпочтительнее пользоваться метод TryParse, приблизительно так:
int j; /* Вернёт значение j=0, даже если метод TryParse потерпит неудачу */
bool bVal = int.TryParse(MyVal.ToString(), out j);
25. Самый подходящий элемент для отображения содержания базы данных — это конечно же DataGridView, упрощенно говоря, сетка данных. Но после завершения редактирования данных пользователем в такой сетке встаёт задача — как передать изменения в базу данных? Одно из решений такой задачки состоит в переписывании (в цикле естественно) значений ячеек сетки DataGridViewCell в значения объекта DataRow , привязанного к сетке объекта DataTable набора данных DataSet . Тут, правда, надо хорошо разбираться в идеологии объектной модели доступа к данным ADO. NET. Затем значения DataRow конкретного столбца переписываем SQL-конструкцией Update непосредственно в базу данных. Все циклы здесь можно прогонять конструкцией foreach
26. Иногда возникает сл. ситуация. На форме есть куча однотипных элементов WinForms, одно и тоже событие которых обрабатывается одинаково. Как пример, есть несколько элементов TextBox, для которых событие, ну скажем, KeyPress обрабатывается одним и тем же методом.
Тогда, вместо такого забойного кода …. :
// Textbox1 …
public void txtbox1_KeyPress(object sender, KeyPressEventArgs e)
{
ObrabKeyPress(sender, e);
}
// Textbox2 …
public void txtbox2_KeyPress(object sender, KeyPressEventArgs e)
{
ObrabKeyPress(sender, e);
}
…
// TextboxN …
public void txtboxN_KeyPress(object sender, KeyPressEventArgs e)
{
ObrabKeyPress(sender, e);
}
… можно сначала определить массив TextBox’ов :
private TextBox[] RetTBox
{
get
{
TextBox[] tba = new TextBox []{ txtBox1, txtBox2, … , txtBoxN };
return tba;
}
}
… а затем, скажем в конструкторе формы, прокрутить такой цикл :
/* Добавляем свой обработчик контроля нажатия клавиш */
foreach (TextBox tb in RetTBox)
tb.KeyPress += new KeyPressEventHandler(ObrabKeyPress);
27. У объекта ADO.Net Reader есть один весьма полезный метод — HasRows. Он возвращает значение true, если в запросе есть данные.
Проконтролировать наличие ‘пустого’ Reader’а в это случае становиться довольно легко:
using (SqlCommand SelCustoms = new SqlCommand(sSel, conn2))
{
rReadCustomer = SelCustoms.ExecuteReader();
//Нет записей
о заказчиках
! Прекращаем читать .. if (!rReadCustomer.HasRows) return 0.0f;
// Пробежимся по всем записям Заказчиков …
while (rReadCustomer.Read())
{
int tip = rReadCustomer.GetInt32(0);
// … Здесь что-то читаем Reader’ом
}
04.08.2013
28. Хорошей альтернативой созданию параметров в простых SQL-запросах (объект Parameters) может стать использование строки запроса методом string.Format (см. Совет 20 ), что-то вроде этого:
string sSQL = string.Format(«Select * From Customers where CustomerID={0}», CustID);
SqlCommand cmd = new SqlCommand(sSQL, conn2)
cmd. ExecuteScalar();
Объём кода при этом значительно сокращается
—
необходимость описывать параметр
,
его тип и значение просто отпадает.
04.08.2013
29. Приступая к созданию своего первого более-менее сложного проекта, не забудьте создать класс для размещения в нём всевозможных мелких вспомогательных утилит. Фактически, наличие такого класса (как правило с именем Utils), стало стандартом для проектирования информационных систем на С#. Получиться что-то вроде аналог ящика для инструментов, из которого вы сможете время от времени доставать нужное (по контексту ситуации) приспособление.
04.12.2013
30. Создание глобальных переменных, видимых из любой части программы, является одним из стандартных положений для разработчика любого уровня. Чаще всего, такая необходимость связана с использованием каких-то глобальных настроек программы. Одним из решений этой задачи является использование настроек — пространство имён My.Setting . Тогда достаточно будет написать, ну скажем в классе Utils (см. Совет 29), простой метод для ‘выдёргивания’ значения этой настройки, что-то вроде этого (в приведённом ниже примере, если уж рассматривать совсем конкретный случай, просто взят год, принятый по умолчанию):
public static int GetGodSetting
{
get {
return (int.Parse)(My.Settings.Default.god);
}
}
В любом месте программы для загрузки года, принятого в настройках по умолчанию, можно использовать такое простое обращение:
int God = Utils.GetGodSetting;
04.12.2013
31. При использовании сложных классических WinForms, старайтесь не перегружать код формы. Например, если на форме есть много кнопок, нажатие которых надо обрабатывать, вместо такого кода (особенно если он забойный) … :
public void Btn1_Click(System.Object sender, System.EventArgs e)
{
// Здесь что-то обрабатываем при нажатии на кнопку Btn1
}
public void Btn
2
_Click(System.Object sender, System.EventArgs e)
{
//
Здесь что-то обрабатываем при нажатии на кнопку
Btn
2
}
…
public void BtnN_Click(System.Object sender, System.EventArgs e)
{
//
Здесь что-то обрабатываем при нажатии на кнопку
BtnN
}
… можно создать класс ну скажем clsClickBtn, в который вынести все методы обработки при нажатии на кнопку, а в конструкторе формы разместить сл. код :
Btn1.Click += new EventHandler(clsClickBtn.Btn1_Click);
Btn2.Click += new EventHandler(clsClickBtn.Btn2_Click);
…
BtnN.Click += new EventHandler(clsClickBtn.BtnN_Click);
Код формы в этом случае может сильно ‘похудеть’.
04.12.2013, г. Юрьевец
32. Ещё один подход к обозначенной в п. 31 проблеме может быть следующий.
Сначала создаём структуру ну допустим для обработки нажатий на гиперссылку LinkLabel:
struct struLL
{
public LinkLabel l;
public LinkLabelLinkClickedEventHandler h;
public struLL( LinkLabel _l, LinkLabelLinkClickedEventHandler _h)
{
this.l = _l;
this.h = _h;
}
}
Далее создаём список из обозначенной выше структуры, что-то вроде такого:
private List GetLLList
{
get
{
List opList = new List();
opList.Add(new struLL(lL_A, clsLLblClick.MethodA));
opList.Add(new struLL(lL_B, clsLLblClick.MethodB));
/* …. */
opList.Add(new struLL(lL_Z, clsLLblClick.MethodZ));
return opList;
}
}
Для инициализации методов обработки при нажатии на гиперссылки (в случае нашего примера) осталось только в конструкторе формы прокрутить такой цикл:
foreach (struLL ll in GetLLList)
ll.l.LinkClicked += ll.h;
31.12.2013
33. Каким образом можно проитерировать управляющие элементы (контролы в просторечии) на форме? Один из подходов описан в Совете 26. Но существует ещё одно решение, пожалуй даже более изящное и простое. Заключается оно в том, что нужные контролы просто помещаем на форме в какой-либо контейнер, типа Panel. В этом случае в конструктор формы помещаем такой простой код (как пример для Кнопок — объект Button) для обработки нажатий :
// Цикл по кнопкам в панели 1…
foreach (Button btn in panel1.Controls)
btn.Click +=new EventHandler(btnClik);
28.03.2014
34. При работе со справочниками часто требуется вернуть значение кода (ключа) по значению описания ключа. Конечно, можно для решения такой задачки создать структуру с двумя полями. Но гораздо проще воспользоваться одной из уже существующих коллекций — например словарем Dictionary. Тогда указанный подход можно продемонстрировать на сл. примере.
Создаем следующий метод :
public static int ReturnKodTown(string s)
{
Dictionary DicTowns = new Dictionary();
DicTowns.Add(1, «Москва»);
DicTowns.Add(2, «Санкт-Петербург»);
DicTowns.Add(3, «Казань»);
DicTowns.Add(4, «Новосибирск»);
DicTowns.Add(5, «Краснодар»);
return DicTowns.First(a => a.Value == s).Key;
}
Теперь узнать код города для нашего примера очень легко:
string gorod = »
Новосибирск
«;
int kod = ReturnKodTown (gorod);
09.08.2014
35. При использовании параметризованных SQL-запросов предпочтительнее пользоваться более современным методом .AddWithValue вместо .Add. Указывать тип поля при таком подходе не обязательно, нужно только указать параметр и его значение:
var myCMD = new SqlCommand(strInsSvod, GlobalVar.conn)
var pars = myCMD.Parameters;
pars.Clear();
//
Используем метод
AddWithValue pars.AddWithValue(«@myPar», myVal);
28.09.2014
36. В развитии темы использования более рациональных подходов создания параметризованных запросов (Совет 35). У коллекции параметров Parameters объекта Command есть ещё один полезный метод, позволяющий загрузить пaраметры в запрос массивом. Называется он . AddRange :
// Готовим массив параметров …
private static SqlParameters[] GetMyPars
{
get
{
SqlParameter[] sqlPar = new SqlParameter[] { new SqlParameter(«@par1», myVal1)),
new SqlParameter(«@par2», myVal2)),
…
new SqlParameter(«@parN», myValN))
}
return sqlPar;
}
// Использование метода .AddRange
using (var cmd = new SqlCommand(s, GlobalVar.conn))
{
var pc = cmd.Parameters;
pc.Clear();
pc.AddRange(GetMyPars);
cmd.ExecuteNonQuery();
}
28.09.2014
37. При инициализации коллекций типа List вместо такого кода:
List MyList = new List();
MyList. Add(«один») ;
MyList.Add(«два»);
MyList.Add(«три»);
…
MyList.Add(«девять»);
… можно использовать более короткую эквивалентную запись:
var MyList = new List
{ «один», «два», «три»,
…
«девять»
}
07.01. 2015
38. При работе с коллекциями иногда хотелось бы не только проитерировать их в одном операторе, но и совершить какую-то обработку. В качестве примера , предположим, что есть массив :
var myInt = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
… и для значений массива меньше или равно 5, нужно умножить на 2, а для более 5 умножить на 3.
Здесь на помощь может придти делегат Func и блочный лямбда-оператор. Что-то вроде этого (понятное дело, блочный лямбда-оператор может быть много сложнее и состоять не из одной строки, как в случае нашего простенького примера):
Func myFunc = (z, y) => {
return (z myFunc(a, 5)).ToArray();
10.01. 2015 , г. Обнинск
40. Назначить свой обработчик событий, скажем, для ввода данных в TextBox можно еще и с использование лямбда-оператора сл. образом (метод MyObrabKeyPress) :
textBox1.KeyPress += (o, e) => MyObrabKeyPress( o, e);
Тогда, даже можно создать свой метод для обработки нажатий в нескольких контролах, что-то вроде такого:
void ObrabTxtKeyPress()
{
textBox1.KeyPress += (o, e) => MyObrabKeyPress( o, e);
textBox2.KeyPress += (o, e) => MyObrabKeyPress( o, e);
textBox3.KeyPress += (o, e) => MyObrabKeyPress( o, e);
…
textBoxN.KeyPress += (o, e) => MyObrabKeyPress( o, e);
}
Затем, такой метод лучше всего поместить в конструктор формы, на которой расположены наши контролы (TextBox’ы для случая нашего примера) :
public frmMain()
{
InitializeComponent();
…
ObrabTxtKeyPress();
}
09.11. 2015
41. Тем, кто создает приложения для работы с базами данных, случается иметь дело с весьма ‘забойными’ SQL-запросами, которые могут занять десятки строчек кода. Но хранить такие запросы в тексте программы, несмотря на определенное удобство для разработчика (код запроса виден прямо в теле программы) не всегда изящно по причине необходимости ‘сцепки’ строчек в запросе. И здесь возможно два варианта решения задачи хранения ‘тяжелых’ запросов. Первый заключается в перемещении запроса непосредственно в базу данных в виде хранимой процедуры (Store Procedure). Второй путь связан с перемещением скрипта в строковую переменную в Настройки (Setting, см. п.30)
09.11. 2015
42. В продолжении темы п.41 . В код программы на C# ‘запилить’ длинный SQL-запрос можно используя символ литерала ‘@’. В этом случае отпадает необходимость в конкатенации строк. Выглядит такая конструкция может приблизительно сл. образом :
string mySql = @»Первая длинная строка запроса
Вторая ну очень длинная строка запроса
Третья длинная строка запроса
…
Последняя строка ну очень длинного запроса»;
29.05. 2016
Simashkov.2010-2016
Здесь я попытался разместить свои небольшие находки и решения некоторых задач. Возможно, кому-то из программистов ( или просто пользователей) они окажутся полезными …
10.01.2012
7. Как сохранить изменения в структуре таблицы в MS SQL Server — 15.01.2012
8. Меняем кодировку текстовых кириллических файлов — 30.06.2013
9. Автоматизируем последовательность действий. Программка Batchrun— 20.07.2013
рани
ц сайта. Инструмент PageSpeed
—19
.05.201
4
11. Как передать файл по ftp из редактора Notepad++. Плагин NppFTP— 02.05.2015
09
.0
4
.2016
4
.2016
16. Как определить полное имя файла, включая путь — 28.05.2016
09
.0
7
.2016
21
.
10
.2017
1
3.
0
1.2018
0
1.2018
22. Изменяем кодировку html-стриницы c Windows-1251 на UTF-8 — 24.02.2018
23.Бесплатная антивирусная утилита Kaspersky Virus Removal Tool — 01.05.2018
0
5.2018
25. Работаем с Яндекс.Диском из Total Commander’а — 15.08.2018
26. Импортируем табличные данные списком со страницы сайта в Инете — 12.05.2019
27. Создание резервных копий по расписанию с помощью WinZip — 08.09.2019
Домашние кинотеатры стали очень популярны в последнее время. При наличии такой аппаратуры вы можете позвать друзей, либо устроить семейный просмотр фильма. Данная техника представлен в виде набора бытовой электроники, но с ее помощью вы можете превратить обычную комнату в кинозал.
Аппаратура представляет собой комплекс телевизора, акустической системы и DVD плеера. Телевизор вам нужно приобрести отдельно, а акустическая система и плеер могут продаваться как вместе, так и по отдельности. Вместе с приобретенной техникой в комплект сходит инструкция, с помощью нее вы сможете правильно расположить вашу технику, в ней также даны рекомендации в подключении.
При выборе техники не забывайте о планировке помещении, необходимо учитывать, что колонки должны быть расположены как перед слушателем, так и за ним. Для компактного помещения подойдут колонки подвесные, но помните, чем меньше они в размерах. Тем хуже качество. Напольные колонки производители выпускают больших размеров, качество звука значительно лучше.
Для комнаты с площадью до 20 метров можно приобрести технику с мощностью звука 100-150 Ватт. Для комнат, имеющие большую площадь, подойдет комплект техники с мощностью 260 и более Ватт. Чем выше мощность, тем дороже техника.
Если вы купили квартиру в Стрежевом и хотите оборудовать ее новой техникой, в таком случае вышеперечисленные советы помогут вам при выборе нужного товара. Вы можете спланировать размещение бытовой аппаратуры в вашей квартире.
Зритель должен располагаться от правой и левой колонки на одинаковом расстоянии, если есть время то можно даже измерить расстояние рулеткой. Лучше всего, если все колонки располагаются от зрителя на одинаковом расстоянии (это не относится к сабвуферу, так как его можно разместить в любом удобном для вас месте) но важно, чтобы его звук воспринимался комфортно, меняйте его положение пока не найдете нужное.
Так как задние колонки следует размещать за зрителем, то зрительное место не должно быть возле самой стенки, если же нет возможности расположить диван в дали от стены то разместите колонки как можно дальше в углы. Колонки рекомендуется располагать чуть выше головы человека. Заранее обдумайте, какие колонки вы будете приобретать, которые располагать на полу или которые на стене, чтобы сделать правильный выбор лучше попробовать оба варианта и после выбрать наиболее комфортный. Если вы выбрали колонки, которые разместите на стене, то вам понадобятся стойки или кронштейны, которые используются для подвеса колонок.
Но не нужно все колонки размещать на стене, так как некоторые имеют отверстие фазоинвертора, оно имеет расположение на задней стороне колонки, такие колонки следует располагать на некотором расстоянии от стены.
Чтобы не происходило резонирование в самом помещении, необходимо либо произвести ремонт с использованием звукоизолирующих материалов, либо разместить в комнате предметы, способные поглощать звук. К таким предметам относятся тяжелые шторы, ковры, можете переставить кресло в угол, и тогда пропадет эхо. Можно повесить на стену картины, которые имеют с обратной стороны войлок и заказать навесной потолок с качественной светотехникой, решив сразу три проблемы — освещение, звукоизоляцию и интерьер. Мягкая мебель тоже способна поглощать звук.
Покупка ноутбука является сложным решением, чем покупка настольного компьютера, потому как кроме определения технических характеристик нужно учитывать вес и размер прибора, энергопотребление. Главное определитесь, для каких целей вы покупаете ноутбук, будет он применяться для работы или для развлечения.
Если вы собираетесь много времени проводить в дороге, то такой критерий как вес является немаловажным. Вам нужно будет приобрести сумку, в которой будете переносить ноутбук. Вы может приобрести прибор с весом до 2 кг, знайте, что различные комплектующие увеличивают вес и вы можете их не брать с собой если в них нет постоянной надобности. Прибор с меньшим экраном весят мало.
Материал, из которого изготовлен корпус прибора, защищает его от различных повреждений. Самый надежный материал – алюминий или магниевый сплав. Но не забывайте бережно относиться с прибору, от заботы зависит сохранность техники, даже пластмассовый корпус при должном обращении прослужит долго. Учтите, что корпус из металла увеличивает общий вес прибора.
Клавиатура ноутбука отличается от клавиатуры настольного компьютера. Клавиши меньше в размерах, поэтому перед покупкой проверьте, удобно ли вам набирать текст. Сенсорная панель является альтернативой мыши. Возле тачпада, который располагается в центре клавиатуры, имеются кнопки.
Если у вас нет возможности подсоединять ноутбук к сети и приходится работать автономно, тогда лучше выбирать ноутбуки с 9-секционным литийионный аккумулятор, с помощью такого аккумулятора можно работать 8 часов в автономном режиме. Если вам необходимо больше времени работать на ноутбуке, в таком случае приобретайте заранее торой аккумулятор.
Покупайте технику только у зарекомендованных производителей. Проконсультируйтесь заранее со специалистами и узнайте как можно больше мнений знакомых и друзей. Помните, что в случае поломки вы можете обратить в сервисные центры, ремонт ноутбуков Севастопольская устраняют различные поломки в жатые сроки по приемлемым ценам.
Утюги, которые имеют подошву из нержавейки отличаются прочностью, материал не царапается и быстро нагревается, при глажении легко скользит по одежде, легко чистится при загрязнении. Производители с каждым разом совершенствуют свои модели, улучшают качество глажки.
Некоторые модели оснащают специальным углублением внутри прибора, в этом углублении собирается пар, который обеспечивает легкое скольжение по одежде. Специальные ложбинки на подошве равномерно распределяют пар, это также способствует более качественному процессу глажения. Сапфировый порошок, которым обрабатывают нержавеющую сталь, защищает подошву от повреждении от пуговиц из металла и молний. Только нужно не забывать после работы протереть подошву влажной тряпкой, чтобы не остались разводы.
Алюминиевое покрытие подошвы также быстро нагревается. Цены на приборы с подошвой из алюминия намного ниже. Тефлоновое покрытие обеспечивает легкое скольжение по одежде, его просто чистить. Но помните, что металлические пуговицы могут оставить на подошве царапины. При керамическом покрытие прибор легко скользит по одежде, ткань не пригорает.
Вам остается только выбрать покрытие, которое вы желаете видеть на вашем приборе. Огромный выбор утюгов вы может найти в магазинах и в интернете. В Интернет магазине NPservice.com.ua вы найдете широкий выбор не только утюгов, но и разнообразной бытовой техники, компьютерной периферии и т.д.
После использования протирайте подошву влажной тканью, предварительно прибор должен остыть. Существуют специальные средства, которые можно применять при чистике нержавеющей подошвы. Желтоватый налет, которые образовался на подошве, можно вывести с помощью ваты и уксуса. Если вы нечаянно прислонили утюг к полиэтиленовому пакету, то жидкость, которую используют для удаления лака поможет вам удалить последствия. Если вы заметили, что утюг прилипает к белью накрахмаленному, вам следует при стирке в крахмал добавлять соль.
При выборе телефона возникает всегда вопрос какое устройство лучше выбрать, чтобы им можно было пользоваться длительное время и не жалеть о покупке? Сегодня существует огромный выбор мобильных телефонов, оснащенных разнообразными функциями, его можно применять не только для разговоров с собеседником, но ив качестве развлечения.
Для начала определитесь, для каких целей вы хотите приобрести телефон. Если вам необходимо постоянно вести деловые разговоры либо нужно поддерживать связь с родными, то стоит сделать выбор в пользу телефонов, имеющих два слота для сим-карт. Если вы любите слушать музыку – выбирайте телефоны с медийными возможностями. Для желающих снимать на видео или делать фотографии подойдут телефоны с камерой. Если же вам нужно устройство только для звонков, тогда вам подойдет простой телефон.
Вторым моментов в выборе телефона будет определение формы устройства. Модели с классическим стилем зарекомендовали себя как надежные и прочные телефоны. Раскладушки имеют очень элегантный внешний вид. При открытие крышки происходит принятие поступающего звонка. Для гламурных и стильных подойдет телефон-слайдер. Такое устройство можно использовать и как медиа проигрыватель, а также данное устройство оснащено QWERTY клавиатурой, она удобна при работе с СМС, электронной почтой.
Вы может приобрести устройство связи, например мобильные телефоны htc, в магазинах вашего города или с помощью Интернет-магазина Сот Маркет. Современные телефоны комфортны в использовании, их снабжают различными функциями. С помощью телефона можно быстро передать нужный файл на другой телефон, также возможность в любое удобное для вас время зайти в Интернет.