Содержание Содержание .......................................................................................................................................................1 Советы ................................................................................................................................................................1 WinForms ...........................................................................................................................................................1 DataGrid: запрет редактирования произвольного столбца. ......................................................................1 PropertyGrid: добавление закладки с событиями. ......................................................................................2 DataGrid: отловить double click на самой сетке а не на контроле. ...........................................................2 Microsoft Internet Controls: контрол для отображения html ......................................................................2 Диалог создания подключения к БД ...........................................................................................................2 Перехват сообщений, посылаемых компонентам .....................................................................................2 Отображение видео на форме. .....................................................................................................................3 asp.net .................................................................................................................................................................3 FileField: получить файл от клиента ...........................................................................................................3 Repeater: templates .........................................................................................................................................4 регулярные выражения .....................................................................................................................................4 регулярные выражения: алфавит .................................................................................................................4 Framework ..........................................................................................................................................................5 Атрибуты: получить значение по умолчанию свойства ...........................................................................5 Атрибуты: получить конвертер объекта .....................................................................................................5 Collections: создание собственной коллекции ...........................................................................................5 DateTime: форматы .......................................................................................................................................5 Windows services: создание, установка, запуск. .........................................................................................5 Windows services: дополнительная информация. ......................................................................................5 Соответсвие типов ........................................................................................................................................8 Работа с сетью ...................................................................................................................................................8 Пересылка файлов с помощью сокетов ......................................................................................................8 Java .....................................................................................................................................................................9 Посылка электронного письма ....................................................................................................................9 Советы 1. Для большей гибкости приложения предпочтительнее использовать асинхронный ввод/вывод. Но стоит всегда анализировать, стоит ли эта гибкость затрат. Асинхронный ввод/вывод реализуется сложнеие обычного. (можно почитать в Jesse Liberty - Programming C#, 3rd Edition (o’reilly)) WinForms DataGrid: запрет редактирования произвольного столбца. //формируем таблицу DataTable dt = new DataTable("Test"); DataColumn c1 = new DataColumn("1"); DataColumn c2 = new DataColumn("2"); dt.Columns.AddRange(new DataColumn[] {c1, c2}); EventInfo[] _ev = typeof (Button).GetEvents(); foreach(EventInfo ei in _ev) { DataRow dr = dt.NewRow(); dr[0] = ei.Name; dr[1] = ""; dt.Rows.Add(dr); } //создаем датагрид 1 DataGrid dg = new DataGrid(); dg.Dock = DockStyle.Fill; dg.DataSource = dt; //создаем стиль для отображения таблицы DataGridTableStyle st = new DataGridTableStyle(); st.MappingName = dt.TableName; //создаем стили для отображения колонок по одному на каждую колонку. DataGridColumnStyle cs1 = new DataGridTextBoxColumn(); cs1.ReadOnly = true; cs1.MappingName = c1.ColumnName; DataGridColumnStyle cs2 = new DataGridTextBoxColumn(); cs2.ReadOnly = false; cs2.MappingName = c2.ColumnName; //добавляем в стиль отображения таблицы стили отображения колонок st.GridColumnStyles.AddRange(new DataGridColumnStyle[] {cs1, cs2}); dg.TableStyles.Add(st); PropertyGrid: добавление закладки с событиями. Ссылка. DataGrid: отловить double click на самой сетке а не на контроле. Чтобы данная операция была возможно, необходимо, чтобы в датагриде были заданы стили для каждого столбца таблицы (см. пример). Если это условие выполнено, тогда: DataGrid _dg; DataGridTextBox _selectedCell; DataGridTextBoxColumn _selectedColumn; _selectedColumn = (DataGridTextBoxColumn) _dg.TableStyles[“TableName”].GridColumnStyle[“ColumnName”]; _selectedCell = (DataGridTextBox) _selectedColumn.TextBox; _selectedCell.DoubleClick += new EventHandler(_selectedCell_DoubleClick); Microsoft Internet Controls: контрол для отображения html Для того, чтобы можно было отобржать html, можно использовать контрол Microsoft Internet Controls, который можно достать из библиотеки C:\WINDOWS\system32\shdocvw.dll. нужно просто ее добавить на контрол и использвать метод Navigate. Диалог создания подключения к БД Для того, чтобы можно было использовать такой же контрол для создания подключения к БД, как и в винде, необходимо добавить Microsoft ActiveX Data Objects 2.7 Library и Microsoft OLE DB Service Component 1.0 Type Library и написать след. кусок кода: MSDASC.DataLinks datalinks = new MSDASC.DataLinksClass(); ADODB.Connection connect = new ADODB.ConnectionClass(); object obj = (object)connect; datalinks.PromptEdit(ref obj); Перехват сообщений, посылаемых компонентам Для перехвата сообщений, посылаемых компонентам, нужно переопределить метод protected override void WndProc(ref Message m). В следующем примере перехватывается клик мышой: protected override void WndProc(ref Message m) { if (m.Msg == 0x0201 || m.Msg == 0x0207 || m.Msg == 0x00A7) { Int32 temp = (Int32) m.LParam; int x = (int) (temp & 0x0000ffff); int y = temp >> 16; 2 x = x + Location.X; y = y + Location.Y; temp = x + (y << 16); SendMessage(Parent.Handle, (uint) m.Msg, (uint) m.WParam, temp); return; } base.WndProc(ref m); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr SendMessage(IntPtr ptr, uint msg, UInt32 wparam, Int32 lparam); Отображение видео на форме. Проще всего использовать com компонент windows media player. У него есть свойство URL, куда нужно прописать адрес мувика. За вид плеера отвечает свойство uiMode: Value Description Audio example Video example invisible Windows Media Player is embedded without any visible user interface (controls, video or visualization window). (Nothing is displayed.) (Nothing is displayed.) none Windows Media Player is embedded without controls, and with only the video or visualization window displayed. mini Windows Media Player is embedded with the status window, play/pause, stop, mute, and volume controls shown in addition to the video or visualization window. full Default. Windows Media Player is embedded with the status window, seek bar, play/pause, stop, mute, next, previous, fast forward, fast reverse, and volume controls in addition to the video or visualization window. custom Windows Media Player is embedded with a custom user interface. Can only be used in C++ programs. (Custom user interface is displayed.) (Custom user interface is displayed.) asp.net FileField: получить файл от клиента 1. установить его как Run as server control. 2. в html код формы добавить <form action = “webform1.aspx” method=”post” enctype=”multipart/form-data” runat=”server” ID=”Form1”> 3. System.Web.UI.HtmlControls.HtmlInputFile File1; //получить полное имя файла string strFileName = File1.PostedFile.FileName; strFileName = System.IO.Path.GetFileName(strFileName); //сохранить закачанный файл на сервере File1.PostedFile.SaveAs(Request.MapPath(Request.ApplicationPath) + “\\” + strFileName); //добавить файл к списку серверных файлов 3 listServerFiles.Items.Add(strFileName); Repeater: templates Для задания вида данного контрола необходимо вручную задать для него шаблоны. Среди них HeaderTemplate, ItemTemplate, FooterTemplate, SeparatorTemplate. Эти шаблоны создаются вручную с помощью html. <asp:Repeater id="Repeater1" runat="server"> <HeaderTemplate> <div class="header"> Films<hr> </div> </HeaderTemplate> <ItemTemplate> <div class="item"> <b>Film name: </b> <%# Convert.ToString(DataBinder.Eval(Container.DataItem, "film_name"))%> <br /> <b>Film location: </b> <%# Convert.ToString(DataBinder.Eval(Container.DataItem, "disc_label"))%> <br /> </div> </ItemTemplate> <SeparatorTemplate> <br /> <hr> <br /> </SeparatorTemplate> <FooterTemplate> <hr> Report additional bugs to <a href="mailto:slava_b@itsoft.by">Viachaslav</a> </FooterTemplate> </asp:Repeater> регулярные выражения регулярные выражения: алфавит Название в списке Условное обозначение Пример использования в поле Любой символ * “к”*“т” – допускает слова типа кит, кот и т.п. Буква С С”от” – допускает слова типа Рот, рот, кот, Кот, мот и т.д. Заглавная буква А A”от” – допускает слова типа Рот, Кот, Мот, Дот и т.п. Строчная буква а а”от” – допускает слова типа рот, кот, мот, дот и т.п. Буква или цифра Х X – допускает любую одиночную цифру или букву. Цифра N N“-й” допускает слова типа 5-й, 4-й, 1-й и т.п. Строка “” “кот” Или | “пл”(“о”|“а”)“т” – допускает слова “плот” и “плат”. Символ из группы [] [тм]“от” – допускает слова тот и мот. Символ не из группы [^] [^т]“от” – допускает слова “кот”, “лот” и т.п., но не допускает слова “тот”. {-} [АБ74]{-} – допускает любые комбинации символов А, Б, 7, 4 произвольной длины. Любое число повторений (распространяется на стоящее слева выражение или подвыражение) 4 Количество повторений n {n} N{2}“-й” допускает слова типа 25-й, 84-й, 11-й и т.п. От n до m повторений {n-m} От 0 до n повторений {-n} N{-2}“-й” допускает слова типа -й, 84-й, 1-й и т.п. От n и больше повторений {n-} N{2-}“-й” допускает слова типа 25-й, 834-й, 311-й, 34576-й и т.п. Подвыражение N{1-3}“-й” допускает слова типа 5-й, 84-й, 111-й и т.п. () Framework Атрибуты: получить значение по умолчанию свойства Некоторые свойства объектов помечены аттрибутом DefaultValueAttribute, в котором хранится значение свойства по-умолчанию. вот как можно достать его: PropertyInfo pi = typeof(Control).GetProperties()[0]; AttributeCollection attributes = TypeDescriptor.GetProperties(control)[pi.Name].Attributes; DefaultValueAttribute defAttributes = (DefaultValueAttribute) attributes[typeof faultValueAttribute)]; object o1 = defAttributes.Value; De- Атрибуты: получить конвертер объекта 1. 2. 3. 4. практически у каждого объекта есть аттрибут [TypeConverter(typeof(SizeConverter))]. достать SizeConverter создать его экземпляр. сконвертить объект в строку. PropertyInfo pi = typeof(Control).GetProperties()[0]; AttributeCollection propTypeAttributes = TypeDescriptor.GetAttributes(pi.PropertyType); TypeConverterAttribute PTAconverter = (TypeConverterAttribute) propTypeAttributes[typeof (TypeConverterAttribute)]; string type = PTAconverter.ConverterTypeName; Type conv = Type.GetType(type); obj = Activator.CreateInstance(conv); MethodInfo mi = conv.GetMethod("ConvertToString", new Type[] {typeof (object)}); string result = mi.Invoke(obj, new object[] {pi.GetValue(control, null)}).ToString(); Collections: создание собственной коллекции Для создания правильной коллекции нужно наследоваться от класса CollectionBase. DateTime: форматы Нужно в методе DateTime.Parse() использовать нужный провайдер формата (там можно указать культуру и т.д.) Windows services: создание, установка, запуск. Линк. Windows services: дополнительная информация. 1. для того, чтобы можно было взаимодействовать со службой через сокетные соединения с удаленного компа, необходимо, чтобы номер порта начинался с номера 47 000. иначе комп, на котором установлена служба, закрывает соединение. 2. для того, чтобы служба могла запускать приложения с UI, необходимо, чтобы у е нее тип был LocalSystem и установлен флаг Allow service to interact with desktop. Если этот флаг не стоит, 5 служба будет запускать указанный процесс, он будет висеть в диспетчере, но визуально показываться не будет. Для установки этого флага программно есть два способа 1) изменть соответсвующий ключ в реестре для этой службы. 2) Использовать Api вызовы Пример using System; using System.Runtime.InteropServices; namespace SCServiceConfig { /// <summary> /// Summary description for Class1. /// </summary> class Configurator { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { Console.WriteLine("Changing config..."); /* Отрытие списка сервисов */ IntPtr schSCManager = IntPtr.Zero; schSCManager = OpenSCManager( IntPtr.Zero, IntPtr.Zero, SC_MANAGER_ALL_ACCESS); /* Lock */ IntPtr sclLock = IntPtr.Zero; sclLock = LockServiceDatabase(schSCManager); /* Определение сарвиса по имени */ IntPtr service = IntPtr.Zero; service = OpenService( schSCManager, "SCService", SERVICE_CHANGE_CONFIG | SERVICE_START); bool res = false; /* Если найден - изменение параметров (SERVICE_INTERACTIVE_PROCESS - понятно из названия) */ if(IntPtr.Zero != service) { res = ChangeServiceConfig( service, SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); } 6 /* Снятие lock'а */ UnlockServiceDatabase(sclLock); /* Старт сервиса */ StartService(service, 0, IntPtr.Zero); } #region DllIpmorts and constants [DllImport("Advapi32.dll", SetLastError = true)] public static extern Boolean ChangeServiceConfig( IntPtr hService, // handle to service UInt32 dwServiceType, // type of service UInt32 dwStartType, // when to start service UInt32 dwErrorControl, // severity of start failure IntPtr lpBinaryPathName, // service binary file name IntPtr lpLoadOrderGroup, // load ordering group name IntPtr lpdwTagId, // tag identifier IntPtr lpDependencies, // array of dependency names IntPtr lpServiceStartName, // account name IntPtr lpPassword, // account password IntPtr lpDisplayName // display name ); [DllImport("Advapi32.dll", SetLastError = true)] public static extern IntPtr OpenSCManager( IntPtr lpMachineName, // computer name IntPtr lpDatabaseName, // SCM database name UInt32 dwDesiredAccess // access type ); [DllImport("Advapi32.dll", SetLastError = true)] public static extern IntPtr LockServiceDatabase( IntPtr hSCManager // handle to SCM database ); [DllImport("Advapi32.dll", SetLastError = true)] public static extern Boolean UnlockServiceDatabase( IntPtr ScLock // SCM database lock ); [DllImport("Advapi32.dll", SetLastError = true)] public static extern Boolean StartService( IntPtr hService, // handle to service UInt32 dwNumServiceArgs, // number of arguments IntPtr lpServiceArgVectors // array of arguments ); public public public public public public const const const const const const UInt32 UInt32 UInt32 UInt32 UInt32 UInt32 SC_MANAGER_CONNECT = 0x0001; SC_MANAGER_CREATE_SERVICE = 0x0002; SC_MANAGER_ENUMERATE_SERVICE = 0x0004; SC_MANAGER_LOCK = 0x0008; SC_MANAGER_QUERY_LOCK_STATUS = 0x0010; SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020; public public public public public const const const const const UInt32 UInt32 UInt32 UInt32 UInt32 SERVICE_INTERACTIVE_PROCESS = 0x00000100; SERVICE_WIN32_OWN_PROCESS = 0x00000010; SERVICE_WIN32_SHARE_PROCESS = 0x00000020; SERVICE_AUTO_START = 0x00000002; SERVICE_NO_CHANGE = 0xffffffff; public const UInt32 SC_MANAGER_ALL_ACCESS = 0x003F; public const UInt32 SERVICE_CHANGE_CONFIG = 0x0002; public const UInt32 SERVICE_START = 0x0010; 7 [DllImport("Advapi32.dll", SetLastError = true)] public static extern IntPtr OpenService( IntPtr hSCManager, // handle to SCM database String lpServiceName, // service name UInt32 dwDesiredAccess // access ); [DllImport("Advapi32.dll", SetLastError = true)] public static extern IntPtr CloseServiceHandle( IntPtr hSCObject // handle to service or SCM object ); #endregion } } Соответсвие типов Visual C++ type .NET Framework type bool System.Boolean signed char (see /J for more information) System.SByte unsigned char System.Byte wchar_t System.Char double and long double System.Double float System.Single int, signed int, long, and signed long System.Int32 unsigned int and unsigned long System.UInt32 __int64 and signed __int64 System.Int64 unsigned __int64 System.UInt64 short and signed short System.Int16 unsigned short System.UInt16 void System.Void Работа с сетью Пересылка файлов с помощью сокетов Для пересылки файлов можно использовать NetworkStream, который получают из сокета, можно писать сразу в сокет. Если писать сразу в сокет, то целесообразно установить его свойство Blocking в true для того, чтобы при посылке/приеме сообщения сокет ждал до тех пор, пока оно не выполнится до конца. Посылка файлов: try { _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket.Blocking = true; _socket.Connect(_address); if (_socket.Connected) { //посылаем файлы for (int i = 0; i < _files.Length; i++) 8 { int b = 0; FileStream ob1; //читаем файл в буфер byte[] textfile = new byte[_files[i].Length]; try { ob1 = new FileStream(_files[i].FullName, FileMode.Open); ob1.Read(textfile, 0, (int)_files[i].Length); ob1.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } //пересылаем длину файла byte[] textlength = Encoding.Default.GetBytes(textfile.LongLength.ToString()); byte[] t = new byte[20]; for (int j = 0; j < textlength.Length; j++) { t[j] = textlength[j]; } _socket.Send(textlength); _socket.Send(textfile); } _socket.Shutdown(SocketShutdown.Both); _socket.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Прием файлов: //читаем длину файла byte[] length = new byte[20]; socket.Receive(length); long _len = Int64.Parse(Encoding.Default.GetString(length)); byte[] request = new byte[_len]; int offset = 0; //читаем весь файл. Здесь происходит чтение в цикле, потому что почему то если пытаться за раз прочитать весь файл, то чтение происходит не до конца. while(offset != _len) { offset += socket.Receive(request, offset, (int) _len-offset, SocketFlags.None); } FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write); fs.Write(request, 0, request.Length); fs.Close(); Java Посылка электронного письма Нужно наличие следующих библиотек: mail.jar и activation.jar public static boolean sendMail(String smtpServer, String to, String from, String subject, String content) throws Exception 9 { boolean _result = false;; Properties _properties = System.getProperties(); _properties.put("mail.smtp.host", smtpServer); Session _session = Session.getDefaultInstance(_properties); MimeMessage _mailMsg = null; try { _mailMsg = new javax.mail.internet.MimeMessage(_session); } catch(Exception e) { } InternetAddress[] _addresses = null; try { if(to != null) { _addresses = InternetAddress.parse(to, false); _mailMsg.setRecipients(Message.RecipientType.TO, _addresses); } else { throw new MessagingException("The mail requires a 'to' address."); } if(from != null) { _mailMsg.setFrom(new InternetAddress(from)); } else { throw new MessagingException("The mail require's a valid 'From' address."); } if(subject != null) { _mailMsg.setSubject(subject, "UTF-8"); } if(content != null) { _mailMsg.setText(content, "UTF-8"); } Transport.send(_mailMsg); } catch(Exception e) { throw e; } return _result; } 10