• Как создать собственную библиотеку?

    SpacePurr
    @SpacePurr Автор вопроса
    c#, wpf
    Вопрос не имеет особого смысла. Закрыто)
    Ответ написан
    Комментировать
  • Как удалить выбранную строку в Datagrid?

    SpacePurr
    @SpacePurr
    c#, wpf
    DataTable Table{get; set;}
    DataAdapter dataAdapter;
    
    private void DeleteMethod(object obj)
    {
    
        var indexDataTable= //получаете здесь индекс из колонки "индекс"(например) выбранной строки
        var indexDataGridRow = //тут индекс самой строки, чтобы удалить ее из DataTable, либо вообще DataTable заново получать
    
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = new SqlConnection(connectionString);
            cmd.CommandText = "DELETE FROM YourTableName where id=" + indexDataTable;
    
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();
        }
    
        Table.Rows[indexDataGridRow].Delete();
        Table.AcceptChanges();
        dataAdapter.Update(Table);
    }
    Ответ написан
    Комментировать
  • Как сделать данную работу на c#?

    SpacePurr
    @SpacePurr
    c#, wpf
    Для примера на WPF.

    После запуска программы в окне изображается две полосы прокрутки.

    Разделим основной Grid на две строки, две колонки. По краям поместим ScrollBar, в большую часть Canvas.
    В Canvas в качестве элементов, которые должны менять позицию, возьмем Button.
    Также добавим обработчики события Button.Click и ScrollBar.Scroll.

    <Window x:Class="Toster.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:Toster"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800" MinWidth="200">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="15"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition Width="15"/>
            </Grid.ColumnDefinitions>
    
            <Canvas Name="Field">
                <Button Canvas.Left="120" Canvas.Top="150" 
                        Height="50" Width="50" Click="Button_Click"/>
                <Button Canvas.Left="250" Canvas.Top="180" 
                        Height="50" Width="50" Click="Button_Click"/>
            </Canvas>
            
            <ScrollBar x:Name="VerticalScrollBar" 
                       HorizontalAlignment="Right" 
                       Grid.Column="1" Grid.Row="0" 
                       Scroll="VerticalScrollBar_Scroll"/>
            <ScrollBar x:Name="HorizontalScrollBar" 
                       Orientation="Horizontal" VerticalAlignment="Bottom" 
                       Grid.Column="0" Grid.Row="1" 
                       Scroll="HorizontalScrollBar_Scroll"/>
        </Grid>
    </Window>


    В основном классе создадим два свойства:
    1. Point SelectedPoint, в которой будут храниться координаты выбранного элемента
    2. Button SelectedButton, которая будет хранить выбранный элемент.

    ScrollBar сделаем неактивными, пока не будут выбраны объекты для перемещения.

    Наводя указатель мыши на одну из двух фигур, можно выбирать, какая из этих фигур связана с полосами прокрутки.

    В событии Button.Click ставим крестик выбранному Button. Сохраняем в свойства SelectedButton и SelectedPoint выбранный элемент и его координаты соответственно.
    Значения свойства Value у ScrollBar заполняем относительным положение Button на Canvas.

    При перемещении полосы прокрутки, создаем новую точку с обратно высчитанными координатами и присваиваем новое положение элемента на Canvas.

    public partial class MainWindow : Window
        {
            public Point SelectedPoint { get; set; }
            public Button SelectedButton { get; set; }
    
            public MainWindow()
            {
                DataContext = this;
                InitializeComponent();
    
                VerticalScrollBar.IsEnabled = false;
                HorizontalScrollBar.IsEnabled = false;
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (SelectedButton != null)
                    SelectedButton.Content = "";
    
                SelectedButton = sender as Button;
                SelectedButton.Content = "X";
    
                SelectedPoint = SelectedButton.TransformToAncestor(Field).Transform(new Point(0, 0));
                VerticalScrollBar.Value = SelectedPoint.Y / Field.ActualHeight;
                HorizontalScrollBar.Value = SelectedPoint.X / Field.ActualWidth;
    
                VerticalScrollBar.IsEnabled = true;
                HorizontalScrollBar.IsEnabled = true;
            }
    
            private void VerticalScrollBar_Scroll(object sender, ScrollEventArgs e)
            {
                SelectedPoint = new Point(SelectedPoint.X, VerticalScrollBar.Value * Field.ActualHeight);
                Canvas.SetTop(SelectedButton, SelectedPoint.Y);
            }
    
            private void HorizontalScrollBar_Scroll(object sender, ScrollEventArgs e)
            {
                SelectedPoint = new Point(HorizontalScrollBar.Value * Field.ActualWidth, SelectedPoint.Y);
                Canvas.SetLeft(SelectedButton, SelectedPoint.X);
            }
        }


    Пример простой, непрофессиональный, но рабочий. Остальное в ваших руках :)

    5dbf2c1f1718c377695765.gif
    Ответ написан
    Комментировать
  • C#. Как правильно вместить внешние dll в один exe?

    SpacePurr
    @SpacePurr
    c#, wpf
    Не все dll можно вместить в .exe.
    Однако, попробуйте вот что. Если работаете в студии, то в Обозревателе Решений выберете ваш проект, перейдите в Ссылки. Нажмите на нужную вам ссылку и в свойствах переключите параметр "Внедрить типы взаимодействия" в True.
    5dbed55dc1005875033495.png
    Ответ написан
    9 комментариев
  • Как задать минимальную ширину кнопки (не её содержимого)?

    SpacePurr
    @SpacePurr
    c#, wpf
    Используйте свойство MinWidth у класса Window, а не Button.
    Ответ написан
    Комментировать
  • Видеоуроки - долго, и много воды. Стоит ли тратить на них время?

    SpacePurr
    @SpacePurr
    c#, wpf
    Я смотрю такие уроки на скорости 1.5x. В основном, дойдя до какой то конкретной задачи на курсе, решаю ее знаниями, которые получил на такой скорости просмотра и гугла.
    Смысл определенный есть, но смотреть полный курс 240 часов незачем.
    Ответ написан
    2 комментария
  • C#. Удалить из файла всё что не связано с введённым ID?

    SpacePurr
    @SpacePurr
    c#, wpf
    Здравствуйте.

    Дело было вечером, делать было нечего.

    Создаем класс UserInfo, в котором будем хранить наши строки.

    class UserInfo
    {
        public string ID { get; set; }
    
        public string AccountName { get; set; }
        public string PersonaName { get; set; }
        public string RememberPassword { get; set; }
        public string Mostrecent { get; set; }
        public string TimeStamp { get; set; }
    }


    Теперь порядок действий такой:
    1. Создаем список наших UserInfo
    2. Парсим файл и заполняем список
    3. На выходе фильтруем список по ID
    4. Создаем новый файл и записываем в него свойства объекта UserInfo, в данном случае строки файла

    class Program
    {
    
        static void Main(string[] args)
        {
            string path = @"E:\=NoDel=\Рабочий стол\Новый текстовый документ (2).txt";
    
            List<UserInfo> users = new List<UserInfo>();
    
            using (StreamReader sr = new StreamReader(path))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    if (line == "{")
                        users.Add(GetUserInfo(sr));
                }
            }
    
            string SelectedID = "\"76561198404997878\""; //например вот такой ID мы выбрали
            string writePath = @"E:\=NoDel=\Рабочий стол\Новый текстовый документ (3).txt";
    
            UserInfo selectedUserInfo = users.FirstOrDefault(u => u.ID.Contains(SelectedID));
    
            using (StreamWriter sw = new StreamWriter(writePath))
            {
                sw.WriteLine("{");
                sw.WriteLine(selectedUserInfo.ID);
                sw.WriteLine("  {");
                sw.WriteLine(selectedUserInfo.AccountName);
                sw.WriteLine(selectedUserInfo.PersonaName);
                sw.WriteLine(selectedUserInfo.RememberPassword);
                sw.WriteLine(selectedUserInfo.Mostrecent);
                sw.WriteLine(selectedUserInfo.TimeStamp);
                sw.WriteLine("  }");
                sw.WriteLine("}");
            }
    
            Console.ReadLine();
        }
    
        public static UserInfo GetUserInfo(StreamReader sr)
        {
            UserInfo userInfo = new UserInfo
            {
                ID = sr.ReadLine()
            };
    
            sr.ReadLine();
    
            userInfo.AccountName = sr.ReadLine();
            userInfo.PersonaName = sr.ReadLine();
            userInfo.RememberPassword = sr.ReadLine();
            userInfo.Mostrecent = sr.ReadLine();
            userInfo.TimeStamp = sr.ReadLine();
            return userInfo;
        }
    }


    Это если по быстрому. В будущем старайтесь разбивать задачу на подзадачи и гуглить. Все это легко решается с помощью нескольких ссылок и серого вещества.

    Удачи.
    Ответ написан
    1 комментарий
  • В DataGridView появляются лишние строки после применения фильтра TreeView, как исправить?

    SpacePurr
    @SpacePurr
    c#, wpf
    На сколько я понял, лишняя строка, которая появляется - это выделенная строка в CurrencyManager.
    Я смог найти два подхода к решению этой проблемы:
    • Отключить CurrencyManager в начале метода фильтрации по дереву
      CurrencyManager currencyManager = (CurrencyManager)BindingContext [dataGridView1.DataSource];
      currencyManager.SuspendBinding();

      Отключение сделает недоступным некоторые возможности, например CurrentRow, CurrentCell и, возможно, еще что-то.

    • Переключать выделение на одну из строк, которые должны быть видимыми.
      dataGridView1.CurrentCell = this.dataGridView1[columnNumber, visibleRowNumber];

      Однако, этот вариант не работает в случае, когда все строки должны быть скрыты.
    Ответ написан
    Комментировать
  • Возможно ли улучшить качество кода?

    SpacePurr
    @SpacePurr
    c#, wpf
    Если мучаешься - бросай. Если интересно - продолжай и код станет лучше. Как и ты. Как и весь мир.
    Ответ написан
    1 комментарий
  • С какой книги начать изучение С#?

    SpacePurr
    @SpacePurr
    c#, wpf
    1. Лучше начинать с ютуба. Посмотреть глазками как вообще люди работают в Visual Studio.
    2. После изучения на ютубе базовых вещей: циклы, типа, условия, видимость переменных, можно переходить к книге.
    3. Советую Эндрю Троельсен Язык программирования C# 7 и платформы .NET и .Net Core 8-е издание (2018).
    Ответ написан
    Комментировать
  • Таблица Excel в Power Point?

    SpacePurr
    @SpacePurr
    c#, wpf
    Качаете шаблоны надстроек(AddIn) в Visual Studio.
    Создаете проект PowerPoint.
    Подключаете excel в фоне как com объект(var excel = CreateObject("Excel.Application") вроде как). Дальше с этим объектом работаете.
    Думаю дальше справитесь с вместе с гуглом по интересующим вас методам excel.
    Удачи.
    Ответ написан
    5 комментариев
  • Особенности словарей и перебор Arraylist?

    SpacePurr
    @SpacePurr
    c#, wpf
    Доступ осуществляется по ключу, а не по индексу. По аналогии со списком, в словаре можно получить доступ к элементам в цикле по ключам.
    Значения словаря хранятся в неотсортированном порядке, более того, ключи могут храниться не в том порядке, в котором они добавляются.
    По аналогии со списками, словарь может хранить вложенные словари.
    Словари реализованы как хеш-таблицы с быстрым доступом.
    Словари, так же как и списки, хранят ссылки на объекты, а не сами объекты.

    upd
    ArrayList это список, реализованный на основе массива

    На сколько я знаю, в Java цикл foreach для ArrayList будет просто синтаксически удобнее, может быть чуточку быстрее, потому как проверка на ограничения индекса массива производится только один раз в начале.
    Ответ написан
    Комментировать
  • Кто может подсказать видеокурс или книгу(с переводом на русский) для обучения java с нуля?

    SpacePurr
    @SpacePurr
    c#, wpf
    Здравствуйте.

    1. Герберт Шилдт - Java 8 Руководство для начинающих 6-е издание. Читается книга достаточно легко. Предварительно, тем не менее, советую забежать на Youtube на канал Уроки Java. Там есть плейлист с 400 уроками, просмотрите хотя бы первые 20, установка IDE, переменные, ООП, а также, чтобы увидеть как кодить. Это вам очень поможет на первых этапах.
    2. Лекции Golovach Courses на Youtube. Мега крутой чувак с самым полным разбором Java, который я видел.
    3. Брюс Эккель - Философия Java. Полный справочник(не самоучитель) всего самого необходимого.
    4. Ну и напоследок сервис JavaRush. Курс в игровом стиле. Задачи с самых простых до сложных со стажировкой на последних уровнях обучения. Подписка по скидке на год стоит около 6к, но если вы серьезно настроены, то прокачать она вас сможет сильно. Я к сожалению до конца курс не прошел так как заинтересовался c#. Прокачивают даже умение поиска информации в google.

    Дерзайте, удачи.
    Ответ написан
    Комментировать
  • DigitalOcean потерял мои даные, как компенсировать потери?

    SpacePurr
    @SpacePurr
    c#, wpf
    Обычно, предлагают сразу все возможные компенсации. В любых других случаях, плохо не будет, если вы вежливо напишите в поддержку свою просьбу.
    Ответ написан
    3 комментария
  • Как переключаться между окнами в WPF с паттерном MVVM?

    SpacePurr
    @SpacePurr
    c#, wpf
    Попробуйте посмотреть здесь Ссылка

    p.s.
    Я сейчас сам изучаю шарп, пишу небольшую программу для работы с Компас 3Д и тоже столкнулся с реализацией открытия новых окон на MVVM, однако ради одного окна я не стал надолго уходить в изучение сервисов навигации и просто создал объект нужного окна в MainViewModel и вызвал у него ShowDialog(), а NewViewModel нового окна привязана к View через DataContext как обычно это делается.
    NewWindow window = new NewWindow();
    window.ShowDialog();

    Для обмена информацией между разными VIewModel использую классы со статическими конструкциями.

    Удачи в изучении.
    Ответ написан
    Комментировать
  • Как изменить фон у button по Click при реализованном новом шаблоне?

    SpacePurr
    @SpacePurr Автор вопроса
    c#, wpf
    Вопрос решен использованием {Binding MyVarName} и реализацией MyVarName переменной в Code Behind с реализованным интерфейсом INotifyPropertyChanged .
    Binding работает как в Border так и в Trigger.
    Все изменяется динамически в процессе работы программы (написал тестовое окно с двум полями, куда вводил HEX цвет, все отлично работает).
    Binding не работает в ColorAnimation. Для передачи цвета в анимацию, аргумент должен быть "замороженным". Однако эта проблема также решаема созданием своего класса Button, наследуемого от FrameworkElement, но для меня это пока дебри.

    Итого:
    1. Реализация линейного градиента
    2. Реализация градиентной зацикленной анимации при наведении
    3. Реализация радиальной заливки при нажатии
    4. Динамическая смена цвета градиента

    XAML:
    <Window x:Class="SxApp.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:SxApp"
            mc:Ignorable="d"
            Title="Aesthetic" Height="450" Width="450">
    
    
        <Window.Background>
            <ImageBrush 
                ImageSource="/SxApp;component/images/bck.jpg" Stretch="UniformToFill"/>
        </Window.Background>
    
    
        <Window.Resources>
            <Color x:Key="vapor_1">#db2525</Color>
            <Color x:Key="vapor_2">#a944ff</Color>
            <Color x:Key="vaporBorder">#8c5791</Color>
            <Color x:Key="vaporLime">#32CD32</Color>
            
            
            <ControlTemplate x:Key="ButtonTemplate"
                             TargetType="Button">
                <Border x:Name="Border"
                        CornerRadius="2000" 
                        TextBlock.Foreground="pink"
                        TextBlock.FontSize="23"
                        TextBlock.FontStyle="Italic"
                        TextBlock.FontWeight="Bold"
                        Margin="10"
                        >
                    <Border.Background >
                        <LinearGradientBrush>
                            <GradientStopCollection>
                                <GradientStop Offset="0" Color="{Binding ButtonColor1}"/>
                                <GradientStop Offset="1" Color="{Binding ButtonColor2}"/>
                            </GradientStopCollection>
                        </LinearGradientBrush>
                    </Border.Background>
    
                    <ContentPresenter
                        RecognizesAccessKey="True"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center"
                        />
                </Border>
    
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="Border" Property="Background">
                            <Setter.Value>
                                <RadialGradientBrush>
                                    <GradientStop Color="{Binding ButtonPressColor1}" Offset="1" />
                                    <GradientStop Color="{Binding ButtonPressColor2}" Offset="0.2" />
                                </RadialGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
    
                    <EventTrigger RoutedEvent="MouseEnter">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty=
                                                "Background.GradientStops[0].Color" 
                                                To="{StaticResource vapor_2}" Duration="0:0:1"
                                                AutoReverse="True"
                                                RepeatBehavior="Forever">
                                </ColorAnimation>
    
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty="Background.GradientStops[1].Color" 
                                                To="{StaticResource vapor_1}" Duration="0:0:1"
                                                AutoReverse="True"
                                                RepeatBehavior="Forever">
                                </ColorAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
    
                    <EventTrigger RoutedEvent="MouseLeave">
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty="Background.GradientStops[0].Color" 
                                                Duration="0:0:1">
                                </ColorAnimation>
    
                                <ColorAnimation Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty="Background.GradientStops[1].Color" 
                                                Duration="0:0:1">
                                </ColorAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Window.Resources>
        
        
        <Grid>
            <Button
                Name="aesButton"
                Click="AesButton_Click"
                Content="Aesthetic"
                Width="200"
                Height="200"
                Template="{StaticResource ButtonTemplate}"/>
        </Grid>
    </Window>


    C#:
    using System;
    using System.ComponentModel;
    using System.Windows;
    
    namespace SxApp
    {
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            private string buttonColor1;
            public string ButtonColor1
            {
                get => buttonColor1;
                set
                {
                    buttonColor1 = value;
                    OnPropertyChanged("ButtonColor1");
                }
            }
    
            private string buttonColor2;
            public string ButtonColor2
            {
                get => buttonColor2;
                set
                {
                    buttonColor2 = value;
                    OnPropertyChanged("ButtonColor2");
                }
            }
    
            private string buttonPressColor1;
            public string ButtonPressColor1
            {
                get => buttonPressColor1;
                set
                {
                    buttonPressColor1 = value;
                    OnPropertyChanged("ButtonPressColor1");
                }
            }
    
            private string buttonPressColor2;
            public string ButtonPressColor2
            {
                get => buttonPressColor2;
                set
                {
                    buttonPressColor2 = value;
                    OnPropertyChanged("ButtonPressColor2");
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
                ButtonColor1 = "#db2525";
                ButtonColor2 = "#a944ff";
                ButtonPressColor1 = "#8c5791";
                ButtonPressColor2 = "#32CD32";
            }
    
            private void AesButton_Click(object sender, RoutedEventArgs e)
            {
                string temp = ButtonColor1;
                ButtonColor1 = ButtonColor2;
                ButtonColor2 = temp;
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void OnPropertyChanged(string propertyName)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }


    5c5c52d0ec636963645101.png

    Для реализации динамической смены цвета в анимации советовали почитать главу "Рисованные элементы" и "Создание элемента управления лишенного внешнего вида" в книге "Мэтью Мак-Дональд. WPF: Windows Presentation Foundation в .NET 4.0 с примерами на C# 2010 для профессионалов".
    Всем большое спасибо.
    Ответ написан
    Комментировать