DataGrid запрет редактирования произвольного столбца

advertisement
Содержание
Содержание .......................................................................................................................................................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
Download