private Button FirstButton = null;
void S_MouseClick(object sender, MouseEventArgs e)
{
var button = (sender as Button);
if (this.FirstButton == null)
{
// это первая кнопка в текущей сессии,
// запоминаем ссылку на кнопку
this.FirstButton = button;
}
else
{
// это вторая кнопка в текущей сессии
// сравниваем текст с первой
if (this.FirstButton.Text == button.Text)
{
Console.WriteLine("Текст совпадает!");
// меняем свойства кнопок
this.FirstButton.Text = button.Text = "--";
this.FirstButton.Enabled = button.Enabled = false;
}
else
{
Console.WriteLine("Текст не совпадает.");
}
// сбрасываем выбор, запуская тем самым новую сессию
this.FirstButton = null;
}
}
// счетчик секунд
int secondsCounter = 0;
var s500A2 = new System.Timers.Timer();
// интервал - одна секунда
s500A2.Interval = 1000;
// обработчик истечения интервала
s500A2.Elapsed += (sender, e) => { // имена sender и e можно поменять, если будут проблемы
Console.WriteLine("Прошла секунда");
// увеличиваем значение счетчика
secondsCounter++;
if (secondsCounter >= 10)
{
Console.WriteLine("Всего прошло 10 секунд");
secondsCounter = 0;
}
};
s500A2.Start();
// интервал - одна секунда
s500A2.Interval = 1000;
s500A2.Elapsed += (sender, e) => {
Console.WriteLine("Прошла секунда: {0:HH:mm:ss.fff}", DateTime.Now);
};
// На выходе будет примерно это:
// Прошла секунда: 14:18:20.950
// Прошла секунда: 14:18:21.964
// Прошла секунда: 14:18:22.978
// Прошла секунда: 14:18:23.992
// Прошла секунда: 14:18:25.006 // потеряли 14:18:24
// Прошла секунда: 14:18:26.020
// Прошла секунда: 14:18:27.034
int lastSecond = 0;
// интервал - десять миллисекунд
s500A2.Interval = 10;
s500A2.Elapsed += (sender, e) => {
int currentSecond = DateTime.Now.Second;
if (currentSecond != lastSecond)
{
Console.WriteLine("Прошла секунда: {0:HH:mm:ss.fff}", DateTime.Now);
lastSecond = currentSecond;
}
};
var result = new Dictionary<int, List<object>>();
foreach (var item in arrComputer)
{
var c = (Comp)item;
// проверяем, есть такой год в коллекции или нет
if (!result.ContainsKey(c.year))
{
// такого года еще нет, добавляем
result.Add(c.year, new List<object> { c });
}
else
{
// год есть, добавляем запись в него
result[c.year].Add(c);
}
}
// в result будет коллекция: год-компьютеры
foreach (int year in result.Keys)
{
Console.WriteLine
(
"В {0} году на Земле вылупилось компьютеров: {1}",
year,
result[year].Count
);
if (result[year].Count > 1)
{
Console.WriteLine("Да это просто демографический взрыв какой-то!");
foreach (var item in result[year])
{
Console.WriteLine("+ {0}", ((Comp)item).marka);
}
}
}
# клонируем рекурсивно, т.к. там ссылка на другой репозиторий
git clone --recursive https://github.com/yar229/WebDavMailRuCloud.git
# тянем последнюю версию nuget, если таковой еще нет
wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -O nuget.exe --no-check-certificate
# восстанавливаем пакеты nuget
mono nuget.exe restore WebDavMailRuCloud/WebDAVMailRuCloud.sln
# пробуем выполнить сборку решения
MONO_IOMAP=case xbuild WebDavMailRuCloud/WebDAVMailRuCloud.sln
MailRuCloudApi.cs(1020,51): error CS0019: Operator `>' cannot be applied to operands of type `long' and `object'
return (fileStream.Length > 0) as object;
MONO_IOMAP=case xbuild WebDavMailRuCloud/WebDAVMailRuCloud.sln
18 Warning(s)
0 Error(s)
mono WebDavMailRuCloud/WDMRC.Console/bin/Debug/wdmrc.exe --help
log4net:ERROR Could not create Appender [ColoredConsoleAppender] of type [log4net.Appender.ColoredConsoleAppender]. Reported error follows.
System.EntryPointNotFoundException: GetConsoleOutputCP
...
nano WebDavMailRuCloud/WDMRC.Console/bin/Debug/wdmrc.exe.config
<log4net threshold="OFF" />
mono WebDavMailRuCloud/WDMRC.Console/bin/Debug/wdmrc.exe --help
WebDAVCloudMailRu 1.0.0.0
yar229@yandex.ru
-p, --port Required. WebDAV server port
-l, --login Required. Login to Mail.ru Cloud
-s, --password Required. Password to Mail.ru Cloud
--maxthreads (Default: 5) Maximum concurrent connections to cloud.mail.ru
--user-agent "browser" user-agent
--help Display this help screen.
--version Display version information.
Unhandled Exception:
System.InvalidOperationException: Property 'enabled' not found in configuration element
at System.Configuration.ConfigurationElement.get_Item (System.String property_name) <0xb50f5608 + 0x000a7> in :0
at System.Configuration.ConfigurationElement.get_Item (System.Configuration.ConfigurationProperty property) <0xb50f55d8 + 0x0001f> in :0
at System.Net.Configuration.DefaultProxySection.get_Enabled () <0xb506a270 + 0x0001b> in :0
at MailRuCloudApi.Account.Login () <0xb50699f8 + 0x000af> in :0
<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
nano WebDavMailRuCloud/MailRuNetCloudClient/MailRuCloudApi/Account.cs
MONO_IOMAP=case xbuild WebDavMailRuCloud/WebDAVMailRuCloud.sln
WebDAV server running. Press 'x' to quit.
string applicationId = "идентификатор вашего приложения";
string scope = "status,email";
string authorizeUrl = "https://oauth.vk.com/authorize";
authorizeUrl += String.Format("?client_id={0}&response_type=code", applicationId);
// authorizeUrl += String.Format("&state={0}", "все что вам нужно");
authorizeUrl += String.Format("&scope={0}", scope);
protected internal void DefaultCallback(object sender, WebBrowserCallbackEventArgs e)
{
// ожидаем, когда будет получен результат
if (e.Url.Query.IndexOf("code=") != -1 || e.Url.Query.IndexOf("oauth_verifier=") != -1)
{
// результат получен, извлекаем код авторизации
// из строка параметров запроса
// e.Url.Query // <= строка параметров запроса
// либо oauth_verifier, либо code - точно уже не помню
}
}
code=полученный код
client_id=идентификатор приложения
client_secret=секретный ключ
grant_type=authorization_code
[JsonProperty(PropertyName = "start", Required = Required.Always)]
public long? start { get; set; }
if (!outRequest.start.HasValue && !outRequest.finish.HasValue && !outRequest.template.HasValue)
{
outRequest = null;
}
[JsonConverter(typeof(ORequestConverter))]
public sealed class ORequest
{
[JsonProperty("start")]
public long? start { get; set; }
[JsonProperty("finish")]
public long? finish { get; set; }
[JsonProperty("template")]
public int? template { get; set; }
}
public class ORequestConverter : JsonConverter
{
public override bool CanWrite
{
get
{
return false;
}
}
public override object ReadJson
(
JsonReader reader,
Type objectType,
object existingValue, JsonSerializer serializer
)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var target = (ORequest)Activator.CreateInstance(objectType);
serializer.Populate(reader, target);
if (!target.start.HasValue && !target.finish.HasValue && !target.template.HasValue)
{
// необходимые поля не найдены или имеют значение null
// возвращаем null
return null;
}
return target;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
private void button2_Click(object sender, EventArgs e) // запуск таймера класс BackgroundWorker
{
// создаем новый экземпляр BackgroundWorker
bw = new BackgroundWorker();
// остальной код
key = true;
// ...
}
EventHandlerList events = (EventHandlerList)typeof(Component).GetProperty
(
"Events",
BindingFlags.NonPublic | BindingFlags.Instance
).GetValue(bw, null);
var k = typeof(BackgroundWorker).GetField
(
"doWorkKey",
BindingFlags.NonPublic | BindingFlags.Static
).GetValue(null);
var handlers = events[k];
Console.WriteLine
(
"Обработчиков {0}",
handlers.GetInvocationList().Length
);
bw.DoWork += (o, eo) =>
{
for (;;)
{
i = time.Time(i);
Thread.Sleep(1000);
// https://msdn.microsoft.com/ru-ru/library/zyzhdc6b.aspx
Invoke(new Action(() => {
Text = "Таймер. Время: " + i;
}));
}
};
<p>
<span class="datetime">
@Html.GetDateTime(DateTime.Now)
</span>
</p>
<p>
<span class="datetime" data-timestamp="@Html.GetTimestamp()">
@Html.GetDateTime(DateTime.Now)
</span>
</p>
<p>Метод <b>Html.GetDateTime</b> вполне может возвращать дату в тегах, тогда будет:</p>
<p>@Html.GetDateTime(DateTime.Now)</p>
<p>а на выходе может быть:<p>
<p>
<span class="datetime" data-timestamp="123">
15.11.2016 21:11:21
</span>
</p>
<p>
<b>timestamp</b> - позволит обойти проблему с форматированием,
при расчете времени на стороне клиента.
</p>
// ServiceReference1 - см. на картинке выше, можно указать любое имя
var client = new ServiceReference1.MerchantWebServiceClient();
// и смотрите какие есть методы в client и что требуется для их использования
// могут быть и другие подводные камни и особенности,
// но свой код взаимодействия писать не придется
// для большинства случаев достаточно будет автоматически созданных классов
private void Cl_SendMessage(string mess)
{
// если метод вызывается не из потока, к которому привязана форма
// https://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.invokerequired.aspx
if (this.InvokeRequired)
{
// делаем вызов из потока формы
// https://msdn.microsoft.com/ru-ru/library/zyzhdc6b.aspx
this.Invoke(new Action<string>(this.Cl_SendMessage), mess);
// уходим из этого метода
return;
// или можно в условии сделать else
// кому как больше нравится
}
// else {
// код находящийся здесь будет выполняться только если
// текущий поток - это поток в котором находится форма
chatLogTB.Text += mess;
// }
}
<DataGrid x:Name="dataGrid" MouseDown="dataGrid_MouseDown"/>
private void dataGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.RightButton == MouseButtonState.Pressed)
{
var row = DataGridRow.GetRowContainingElement(e.OriginalSource as FrameworkElement);
if (row != null)
{
// dataGrid.SelectedIndex = row.GetIndex();
dataGrid.SelectedItem = row;
}
}
}
public partial class Form1 : Form
{
private Panel TableContainer = new Panel();
private NumericUpDown Columns = new NumericUpDown();
private NumericUpDown Rows = new NumericUpDown();
public Form1()
{
InitializeComponent();
this.Width = 420;
var flowLayoutPanel = new FlowLayoutPanel();
var LabelColumns = new Label();
var LabelRows = new Label();
var Create = new Button();
// панель для редактора таблицы
flowLayoutPanel.SuspendLayout();
flowLayoutPanel.AutoSize = true;
flowLayoutPanel.Controls.Add(LabelColumns);
flowLayoutPanel.Controls.Add(Columns);
flowLayoutPanel.Controls.Add(LabelRows);
flowLayoutPanel.Controls.Add(Rows);
flowLayoutPanel.Controls.Add(Create);
flowLayoutPanel.Dock = DockStyle.Top;
flowLayoutPanel.Location = new Point(0, 0);
LabelColumns.AutoSize = true;
LabelColumns.Dock = DockStyle.Fill;
LabelColumns.ImageAlign = ContentAlignment.MiddleLeft;
LabelColumns.Location = new Point(3, 0);
LabelColumns.Size = new System.Drawing.Size(53, 29);
LabelColumns.Text = "Колонок:";
LabelColumns.TextAlign = ContentAlignment.MiddleLeft;
LabelRows.AutoSize = true;
LabelRows.Dock = DockStyle.Fill;
LabelRows.Location = new Point(117, 0);
LabelRows.Size = new Size(40, 29);
LabelRows.Text = "Строк:";
LabelRows.TextAlign = ContentAlignment.MiddleLeft;
Columns.Dock = DockStyle.Fill;
Columns.Location = new Point(62, 3);
Columns.Minimum = 1;
Columns.Size = new System.Drawing.Size(49, 20);
Columns.Value = 3;
Rows.Dock = DockStyle.Fill;
Rows.Location = new Point(163, 3);
Rows.Minimum = 1;
Rows.Size = new Size(49, 20);
Rows.Value = 2;
Create.AutoSize = true;
Create.Dock = DockStyle.Left;
Create.Location = new Point(218, 3);
Create.Size = new Size(75, 23);
Create.Text = "Создать";
Create.UseVisualStyleBackColor = true;
Create.Click += new System.EventHandler(CreateTable);
// контейнер для вывода готовой таблицы
TableContainer.Dock = DockStyle.Fill;
// добавляем необходимые элементы на форму
this.Controls.Add(flowLayoutPanel);
this.Controls.Add(TableContainer);
this.Controls.SetChildIndex(flowLayoutPanel, 1);
this.Controls.SetChildIndex(TableContainer, 0);
}
private void CreateTable(object sender, EventArgs e)
{
// удаляем предыдущую таблицу
TableContainer.Controls.Clear();
// создаем новую
var tableLayoutPanel = new TableLayoutPanel();
tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
tableLayoutPanel.Visible = true;
tableLayoutPanel.ColumnCount = Convert.ToInt32(Columns.Value);
tableLayoutPanel.RowCount = Convert.ToInt32(Rows.Value);
// генератор случайных чисел для раскраски панелей (чтобы было видно)
var rnd = new Random(DateTime.Now.Millisecond);
// определяем размер одной колонки и строки, в процентах
int width = 100 / tableLayoutPanel.ColumnCount;
int height = 100 / tableLayoutPanel.RowCount;
this.Text = String.Format("{0}x{1}", width, height);
// добавляем колонки и строки
for (int col = 0; col < tableLayoutPanel.ColumnCount; col++)
{
// добавляем колонку
tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, width));
for (int row = 0; row < tableLayoutPanel.RowCount; row++)
{
// добавляем строку
if (col == 0)
{
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, height));
}
// добавляем цветную панель, чтобы было видно ячейку в таблице
var panel = new Panel();
panel.BackColor = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255));
panel.Dock = DockStyle.Fill;
tableLayoutPanel.Controls.Add(panel, col, row);
}
}
// добавляем таблицу в контейнер
TableContainer.Controls.Add(tableLayoutPanel);
}
}
Выражение await не блокирует поток, в котором оно выполняется. Вместо этого оно указывает компилятору объявить оставшуюся часть асинхронного метода как продолжение ожидаемой задачи. Управление затем возвращается методу, вызвавшему асинхронный метод. Когда задача завершается, она вызывает свое продолжение и возобновляет выполнение асинхронного метода с того места, где она была прервана.
// без ожидания
Console.WriteLine(DateTime.Now);
Task.Run(() => { Thread.Sleep(5000); });
// этот код будет выполнен сразу
Console.WriteLine(DateTime.Now);
// ожидание с await
Console.WriteLine(DateTime.Now);
await Task.Run(() => { Thread.Sleep(5000); });
// этот код будет выполнен, только после завершения выполнения задачи
// текущий (вызывающий) поток не будет приостановлен
// (например, в Windows Form это будет хорошо видно)
Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.Now);
var t = Task.Run(() => { Thread.Sleep(5000); });
t.Wait(); // ожидание выполнения задачи
// этот код будет выполнен, только после завершения выполнения задачи
// текущий (вызывающий) поток будет блокирован
// (например, в Windows Form это будет хорошо видно)
Console.WriteLine(DateTime.Now);
string answer;
string yes = "yes";
// из yes лучше сделать константу, чтобы в этом был смысл :)
// const string yes = "yes";
// либо массив - это позволит проверять разные варианты ответов
string[] yesVariants = { "yes", "y", "true", "да", "еще бы", "только об этом и мечтаю" };
// или можно использовать регулярные выражения
do
{
// любой код здесь
Console.WriteLine("Желаете повторить тест?(Yes/No) ");
answer = Console.ReadLine();
} while (answer.Equals(yes, StringComparison.OrdinalIgnoreCase));
// проверка по массиву ответов
// } while (yesVariants.Contains(answer, StringComparer.OrdinalIgnoreCase));
// необходимо обязательно указать иконку
// иначе уведомление не будет отображаться
// можно использовать иконку формы
notifyIcon1.Icon = this.Icon;
// показываем уведомление
notifyIcon1.ShowBalloonTip(
10000,
"Новый ответ",
"Поступил новый ответ на ваш вопрос на Toster.ru",
ToolTipIcon.Info
);
// или с текстом по умолчанию (см. BalloonTipTitle, BalloonTipText)
// notifyIcon1.ShowBalloonTip(10000);
http://localhost:11733/meropriyatia
http://localhost:11733/meropriyatiavnikolaeve
routes.MapRoute(
"meropriyatiavnikolaeve", // имя
"meropriyatiavnikolaeve", // шаблон
new { controller = "Home", action = "meropriyatiavnikolaeve" }
);