• С чего начать программирование?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Учи C#. Плюсы конкретно для тебя (возраст):
    1. Море инфы на русском языке и почти вся справка.
    2. Удобнейшая среда разработки и тоже есть на русском языке. При том есть такая фишка, как XML документирование кода. Наводишь курсор мыши на метод в коде или класс, например, и читаешь его описание на русском языке. Это сильно ускорит твоё обучение. При том это реально крутой язык. Очень сильно похож на Java.
    3. Море видеокурсов на русском языке, при том есть очень вменяемые (гугли ITVDN).

    Один из адекватнейших и бесплатных курсов
    Читать:
    1. Герберт Шилдт. Полный справочник по C#.
    2. CLR via C# - Программирование на платформе Microsoft.NET Framework 4.5 на языке C#.
    И так же есть море книг уже по конкретным технологиям языка:
    - ADO.NET и в дополнение Entity Framework (Работа с базами данных).
    - WPF (пользовательский интерфейс, при том одна из удобнейших технологий с серьёзными возможностями).
    - Windows Forms (пользовательский интерфейс).
    - ASP.NET (разработка веб приложений, сайтов).
    - WCF (удобное сетевое программирование, если вкратце, а так можно по старинке на сокетах всё делать).
    - Что-то я определённое не упомянул...
    Скачать Visual Studio 2015 Community Edition
    Ответ написан
  • Как выполнить сразу несколько действий при нажатии на кнопку?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Разобрался. Нужно в Condition обоих Publish поместить 1 (единицу).
    <!-- Чтобы выполнились сразу 2 действия, нужно в качестве Condition указать 1 у обоих действий -->
     <Publish Dialog="SettingsDlg" Control="Next" Event="DoAction" Value="DoMethodAction2" Order="1" >1</Publish>
    <Publish Dialog="SettingsDlg" Control="Next" Event="NewDialog" Value="SettingsPreviewDlg" Order="2">1</Publish>
    Ответ написан
    Комментировать
  • Стоит ли записываться на курсы от geekbrains? Или стоит получить второе высшее образование?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Что-то тут никто не упомянул в спорах про вуз и курсы, что если у тебя есть 6 лет опыта, то за границей это равняется тому, что у тебя высшее образование. Точнее, тебя без проблем возьмут на работу. И есть у меня знакомый, который уехал в США работать С++ программистом, бросил универ и уехал. Правда через какое-то время он там будет поступать.
    Ответ написан
    Комментировать
  • Не удаётся получить доступ к asp:TextBox из кода. Как получить оттуда значение?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Решил проблему так:

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WebAppSendMessage.Views.Index" %>
    
    <asp:Content ID="header" ContentPlaceHolderID="head" runat="server">
        <style>
            input[type=text] {
                margin-top: 5px;
                margin-left: 3px;
                margin-right: 3px;
                width: 100%;
            }
    
            input[type=submit] {
                margin-top: 5px;
                margin-left: 3px;
                margin-right: 3px;
            }
        </style>
    </asp:Content>
    
    <asp:Content ID="mainContent" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
        <form id="mainForm" method="post" runat="server">
            <asp:TextBox ID="textBox" runat="server" />
            <br />
            <asp:Button ID="sendMessageButton" runat="server" Text="Отправить сообщение"  OnClick="SendMessageButton_OnClick"/>
        </form>
    </asp:Content>


    using System;
    using System.Web;
    using System.Web.UI;
    
    namespace WebAppSendMessage.Views
    {
        public partial class Index : Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                HttpCookie cookie = Request.Cookies["mainMessage"];
                
                if (cookie != null)
                {
                    string message = cookie["Message"];
                    if (message != null)
                    {
                        textBox.Text = message;
                    }
                }
            }
    
            protected void SendMessageButton_OnClick(object sender, EventArgs e)
            {
                HttpCookie cookie = Request.Cookies["mainMessage"];
                if (cookie == null)
                {
                    cookie = new HttpCookie("mainMessage");
                    cookie.Expires = DateTime.Now.AddYears(1);
                }
    
                string message = Request.Form[textBox.UniqueID];
                cookie["Message"] = message;
                Session["Message"] = message;
                Session["BackAddress"] = Request.RawUrl;
    
                Response.Charset = "utf-8";
                Response.Cookies.Add(cookie);
    
                Response.Redirect("Message.aspx");
            }
        }
    }


    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true"
        CodeBehind="Message.aspx.cs" Inherits="WebAppSendMessage.Views.Message" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
        <form id="mainForm" runat="server">
            <asp:Label runat="server" Text="<%# Text %>"></asp:Label>
            <br />
            <asp:Button ID="backButton" runat="server" Text="Вернуться" OnClick="GoToBackButton_OnClick" />
        </form>
    </asp:Content>


    using System;
    using System.Web;
    using System.Web.UI;
    
    namespace WebAppSendMessage.Views
    {
        public partial class Message : Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    DataBind();
                }
            }
    
            protected string Text
            {
                get { return (string)Session["Message"]; }
            }
    
            protected void GoToBackButton_OnClick(object sender, EventArgs e)
            {
                string returnUrl = Session["BackAddress"] as string ?? "Index.aspx";
                Response.Redirect(returnUrl);
            }
        }
    }
    Ответ написан
    Комментировать
  • Привык работать с чистым кодом, а заказчику надо CMS. С чего начать?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    professorweb.ru/my/ASP_NET/gamestore/level1
    Но нужно знать C#. За то там всё расписано по шагам с админкой, насколько я помню. Ещё там bootstrap юзается. Если знаешь C#, то советовал бы из двух вариантов выбрать не ASP.NET WebForms, а ASP.NET MVC.
    Ответ написан
    Комментировать
  • Уничтожить объект в foreach?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Никак, если эта копия никак не ссылается на исходный объект и если ты не инкрементируешь какую-то переменную типа int, чтобы с её помощью обратиться к исходному массиву по этому индексу и удалить там объект тоже. Но тогда зачем использовать foreach.

    Вот о чём я.
    public class Person
        {
            public string Name { get; set; }
    
            public int Age { get; set; }
        }


    class Program
        {
            static void Main(string[] args)
            {
                var source = new Person[]
                    {
                        new Person { Age = 20, Name = "Сергей" },
                        new Person { Age = 32, Name = "Дмитрий" },
                        new Person { Age = 18, Name = "Андрей" }
                    };
    
                var copy = new Person[source.Length];
                Array.Copy(source, copy, source.Length);
    
                DisplayPersons(copy);
                Console.WriteLine();
    
                int index = 0;
                foreach (Person person in copy)
                {
                    Console.WriteLine(person.Name + " удалён из исходного массива");
                    source[index++] = null;
                }
    
                if (source.Any(p => p != null))
                {
                    Console.WriteLine("Не удалось удалить все элементы исходного массива.");
                }
    
                Console.ReadKey();
            }
    
            static void DisplayPersons(IEnumerable<Person> persons)
            {
                foreach (Person person in persons)
                {
                    Console.WriteLine("Имя: {0}, возраст: {1}", person.Name, person.Age);
                }
            }
        }
    Ответ написан
    Комментировать
  • При работе с mysql.exe, как настроить так, чтобы выходной файл бэкапа был в кодировке UTF-8?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Да я уж понял, просто код не я писал, который его делает, я увидел позже, что этим занимается mysqldump.

    Добавил я этот ключ, ничего не изменилось, оказывается по умолчанию и так в UTF 8 без BOM сохранялось. Просто, когда я открываю в dbForge Studio for MySQL, то вижу это:
    b63334cfc306.jpg
    Ответ написан
  • Как убрать фриз программы c# WPF?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Ты для авторизации создаёшь целый поток. Почему тормоза тебе уже сказали, ты вызываешь authVK.join() в основном потоке и тем самым его сам же стопоришь, пока не выполнится второй поток. Вообще благодаря этому коду ты тратишь больше ресурсов и вызываешь ещё большие тормоза, если бы вообще не юзал поток.

    В данном случае использовать нужно Task. Или ещё уйму способов выполнить код не в основном потоке и не создавать новый. Почитай про пул потоков и задачи (Task).

    Я смотрю ты создал константу Empty с пустой строкой!? Так есть же string.Empty стандартный.

    <Window x:Class="Wpf_Task.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow"
            Width="525"
            Height="350"
            WindowStartupLocation="CenterScreen">
       <Window.Resources>
          <Storyboard x:Key="OnLoaded1"
                      RepeatBehavior="Forever">
             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="border"
                                            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)">
                <EasingDoubleKeyFrame KeyTime="0"
                                      Value="0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1"
                                      Value="360" />
             </DoubleAnimationUsingKeyFrames>
          </Storyboard>
       </Window.Resources>
    
       <Window.Triggers>
          <EventTrigger RoutedEvent="FrameworkElement.Loaded">
             <BeginStoryboard Storyboard="{StaticResource OnLoaded1}" />
          </EventTrigger>
       </Window.Triggers>
    
       <Grid>
    
          <Button x:Name="executeButton"
                  Width="75"
                  Margin="0,216,0,0"
                  HorizontalAlignment="Center"
                  VerticalAlignment="Top"
                  Click="Button_Click"
                  Content="Выполнить"
                  TextOptions.TextFormattingMode="Display" />
    
          <Rectangle x:Name="border"
                     Width="100"
                     Height="100"
                     Margin="208,57,208,161"
                     HorizontalAlignment="Center"
                     VerticalAlignment="Center"
                     RenderTransformOrigin="0.5,0.5">
             <Rectangle.Fill>
                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                   <GradientStop Offset="0" Color="#FFD1BD69" />
                   <GradientStop Offset="1" Color="#FFFFF5C9" />
                </LinearGradientBrush>
             </Rectangle.Fill>
             <Rectangle.RenderTransform>
                <TransformGroup>
                   <ScaleTransform />
                   <SkewTransform />
                   <RotateTransform />
                   <TranslateTransform />
                </TransformGroup>
             </Rectangle.RenderTransform>
          </Rectangle>
    
          <TextBlock x:Name="_result"
                     Margin="0,187,0,0"
                     HorizontalAlignment="Center"
                     VerticalAlignment="Top"
                     Text="..."
                     TextOptions.TextFormattingMode="Display"
                     TextWrapping="Wrap" />
    
       </Grid>
    </Window>


    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows;
    
    namespace Wpf_Task
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                executeButton.IsEnabled = false;
                Task<int>.Factory.StartNew(() =>
                {
                   return Auth.Login();
                })
                .ContinueWith(task => //Выполнить код в основном потоке (TaskScheduler.FromCurrentSynchronizationContext())
                {
                    executeButton.IsEnabled = true;
                    _result.Text = task.Result.ToString();
                }, TaskScheduler.FromCurrentSynchronizationContext());
            }
        }
    
        public static class Auth
        {
            private static int _counter;
    
            public static int Login()
            {
                Thread.Sleep(1000);
                return ++_counter;
            }
        }
    }
    Ответ написан
    3 комментария
  • Просто убийственно тормозит XAML дизайнер после добавления Autofac. Кто-нибудь с такой проблемой сталкивался?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Обновлено: 10.07.2015
    В общем решил проблему так. В конструкторе ViewModelLocator почти ничего не выполняю в режиме дизайнера кода, а свойство сделал таким:
    public MainViewModel Main
            {
                get
                {
                    return !ViewModelBase.IsInDesignModeStatic ?
                        _container.Resolve<MainViewModel>() :
                        _designerMainVm ?? (_designerMainVm = 
                        new MainViewModel(null, null, null, null) { Settings = new AppSettings() });
                }
            }

    Конец обновленного текста

    ViewModelLocator.cs
    public class ViewModelLocator : ViewModelLocatorBase
        {
            private readonly IContainer _container;
            private static ViewModelLocator _locator;
    
            public ViewModelLocator()
            {
                _locator = this;
    
                if (!ViewModelBase.IsInDesignModeStatic)
                {
                    Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
                    Application.Current.MainWindow.Loaded += MainWindow_Loaded;
                    Application.Current.MainWindow.Closing += MainWindow_Closing;
                }
    
                LogManager.Logger.LogPath = LocalConfiguration.Instance.Folders.Logs;
    
                DispatcherHelper.Initialize();
                CorrelationsLocator.Initialize();
    
                if (!ViewModelBase.IsInDesignModeStatic)
                {
                    ProgramIdentification.Initialize(ProgramIdentifier.CbpOperator);
    
                    LocalConfiguration.Instance.Folders.CheckFolders();
                    LocalConfiguration.Instance.LoadAppConfig();
                    LocalConfiguration.Instance.LoadLocalSettings();
    
                    WpfSingleInstance.AppIsAlreadyRunning += (sender, args) =>
                        MessageBox.Show(string.Format("Приложение: {0} уже запущено", args.AppName));
                    WpfSingleInstance.Make();
                }
                _container = RegisterDependencies(LocalConfiguration.Instance);
            }
    
            private IContainer RegisterDependencies(LocalConfiguration config)
            {
                var builder = new ContainerBuilder();
    
                builder.RegisterType<LauncherViewModel>().SingleInstance();
                builder.RegisterType<ShutdownViewModel>().SingleInstance();
                builder.RegisterType<CommandManager>().SingleInstance();
                builder.RegisterType<AccountControllerVm>().SingleInstance();
                builder.RegisterType<ComponentEditorViewModel>().SingleInstance();
                builder.RegisterType<ComponentSelectorViewModel>().SingleInstance();
                builder.RegisterType<RecipeTimeSetEditorViewModel>().SingleInstance();
                builder.RegisterType<CategoryEditorViewModel>().SingleInstance();
                builder.RegisterType<AboutDialogViewModel>().SingleInstance();
                builder.RegisterType<L1ApplicationManagerViewModel>().SingleInstance();
    
                builder.RegisterType<CarEditorViewModel>() //Редактор машин
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.CarsWindowSettings; //Настройки окна (положение, размер, состояние)
                    }).SingleInstance();
    
                builder.RegisterType<ClientsEditorViewModel>() //Редактор клиентов
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.ClientsWindowSettings; //Настройки окна (положение, размер, состояние)
                    }).SingleInstance();
    
                builder.RegisterType<ReportsWindowViewModel>() //Отчёты
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.ReportsWindowSettings; //Настройки окна (положение, размер, состояние)
                        e.Instance.ReportsFolder = config.Folders.Documents;
                        e.Instance.ReportMode = ReportMode.Applications;
                    });
    
                builder.RegisterType<EventLogViewModel>() //Журнал событий
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.EventLogWindowSettings; //Настройки окна (положение, размер, состояние)
                        e.Instance.SetConfiguration(config.Config, config.Folders.EventReportFolder);
                    });
    
                builder.RegisterType<RecipesEditorViewModel>() //Редактор рецептов
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.RecipeWindowSettings; //Настройки окна (положение, размер, состояние)
                        e.Instance.SetEditorSettings(config.Settings.RecipeEditorConfig);
                    })
                    .SingleInstance();
    
                builder.RegisterType<ApplicationsEditorViewModel>() //Редактор заявок
                    .OnActivated(e =>
                    {
                        e.Instance.LastSelectedItems = config.Settings.LastSelectedItemsInAppWindow; //Состояние последних выбранных элементов.
                        e.Instance.WindowSettings = config.Settings.AppEditorWindowSettings;
                    })
                    .SingleInstance();
    
                builder.RegisterType<MainViewModel>() 
                    .OnActivated(e =>
                    {
                        var appManager = e.Context.Resolve<L1ApplicationManagerViewModel>();
                        appManager.Main = e.Instance;
                        if (!ViewModelBase.IsInDesignModeStatic)
                        {
                            e.Instance.Title = ProgramIdentification.GetCurrentProgramName();
                        }
                        e.Instance.Settings = config.Settings.ApplicationSettings;
                    })
                    .SingleInstance();
    
                return builder.Build();
            }
    
            private void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                WindowManager.Instance.Initialize(Application.Current.MainWindow, Main);
                Main.OnWindowLoaded();
            }
    
            private void MainWindow_Closing(object sender, CancelEventArgs e)
            {
                Debug.WriteLine("Начало: MainWindow_Closing");
                Window window = (Window)sender;
    
                Debug.WriteLine("Конец: MainWindow_Closing");
    
                if (WindowManager.Instance.OpenMessageDialog(DialogIcons.Help, DialogButtons.YesNo,
                    "Выход из программы",
                    "Вы действительно хотите завершить работу приложения?") == UserDialogResult.No)
                    e.Cancel = true;
                else
                {
                    window.Closing -= MainWindow_Closing;
                    try
                    {
                        LocalConfiguration.Instance.SaveLocalSettings();
                        LocalConfiguration.Instance.SaveCurrentAppConfig();
                    }
                    catch (Exception ex)
                    {
                        LogManager.Logger.AppendException(ex);
                    }
                }
            }
    
            private void Current_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
            {
                LogManager.Logger.AppendException(e.Exception);
                MessageBox.Show(e.Exception.ToString());
            }
    
            #region Свойства
    
            public static ViewModelLocator Current
            {
                get { return _locator; }
            }
    
            public MainViewModel Main
            {
                get { return _container.Resolve<MainViewModel>(); }
            }
    
            public L1ApplicationManagerViewModel ApplicationsManager
            {
                get { return _container.Resolve<L1ApplicationManagerViewModel>(); }
            }
    
            public AccountControllerVm AccountController
            {
                get { return _container.Resolve<AccountControllerVm>(); }
            }
    
            public ShutdownViewModel Shutdown
            {
                get { return _container.Resolve<ShutdownViewModel>(); }
            }
    
            public CategoryEditorViewModel CategoryEditor
            {
                get { return _container.Resolve<CategoryEditorViewModel>(); }
            }
    
            public ApplicationsEditorViewModel ApplicationsEditor
            {
                get { return _container.Resolve<ApplicationsEditorViewModel>(); }
            }
    
            public RecipesEditorViewModel RecipesEditor
            {
                get { return _container.Resolve<RecipesEditorViewModel>(); }
            }
    
            public ComponentEditorViewModel ComponentEditor
            {
                get { return _container.Resolve<ComponentEditorViewModel>(); }
            }
    
            public ComponentSelectorViewModel ComponentsSelector
            {
                get { return _container.Resolve<ComponentSelectorViewModel>(); }
            }
    
            /// <summary>Редактор клиентов</summary>
            public ClientsEditorViewModel ClientsEditor
            {
                get { return _container.Resolve<ClientsEditorViewModel>(); }
            }
    
            public CarEditorViewModel CarsEditor
            {
                get { return _container.Resolve<CarEditorViewModel>(); }
            }
    
            public CommandManager CommonCommands
            {
                get { return _container.Resolve<CommandManager>(); }
            }
    
            public LauncherViewModel Launcher
            {
                get { return _container.Resolve<LauncherViewModel>(); }
            }
    
            public AboutDialogViewModel About
            {
                get { return _container.Resolve<AboutDialogViewModel>(); }
            }
    
            /// <summary>
            /// Возвращает новый экземпляр модели представления Отчётов
            /// </summary>
            public ReportsWindowViewModel NewReport
            {
                get { return _container.Resolve<ReportsWindowViewModel>(); }
            }
    
            /// <summary>
            /// Возвращает новый экземпляр модели представления Журнала событий
            /// </summary>
            public EventLogViewModel NewEventLog
            {
                get { return _container.Resolve<EventLogViewModel>(); }
            }
    
    
            #endregion
    
            #region Методы
    
    
            #endregion
        }
    Ответ написан
  • Как запретить остановку программы?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Обычно, когда рассказывают, что что-то не работает, прикладывают код. Сидел и думал, а причём тут WPF.
    Ответ написан
  • Как правильно написать на MVVM?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Если актуалити, то могу показать пример с библиотекой MvvmLight.
    Ответ написан
  • Современные технологии для разработки десктоп-приложений в Windows?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    WPF умирает? Аза-за-за! Не смеши.
    Ответ написан
    Комментировать
  • Как отловить момент, когда окно помещается в одну из сторон экрана (прилипает как бы), при нажатии WIN + LEFT?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Вот решение проблемы с максимизацией окна
    blogs.msdn.com/b/llobo/archive/2006/08/01/maximizi...

    Но в конкретно этом примере есть проблема, там сбрасывается минимальный размер окна. Его тоже нужно задавать.
    Ответ написан
    Комментировать
  • Как удалить определенный Image с Canvas?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Ну вот, к примеру:
    private void DoWork()
    {
        Canvas CnMapField = new Canvas();
    
        Image[] images = CopyFrom<Image>(CnMapField.Children);
        foreach (Image img in images)
        {
            if (img.Margin.Left == x)
                CnMapField.Children.Remove(img);
        }
    }
    
    private T[] CopyFrom<T>(UIElementCollection collection) where T : UIElement
    {
        var images = new List<T>(collection.Count);
        images.AddRange(collection.Cast<T>());
        return images.ToArray();
    }


    То есть ты foreach(ем) бегаешь по копии коллекции, а удаляешь из оригинала.

    Хотя в данном случае приведение к Image не обязательно.
    Ответ написан
    Комментировать
  • Как получить из таблицы записи по коллекции ключей?

    Casper-SC
    @Casper-SC Автор вопроса
    Программист (.NET)
    Сам разобрался. Решил так:
    public DbPicture[] GetImages(string[] keys)
            {
                return _context.Pictures.Where(p => keys.Any(k => k == p.FileName)).ToArray();
            }
    Ответ написан
    Комментировать