Ответы пользователя по тегу C#
  • Как импортировать(экспортировать) из Excel в C#?

    @Sumor
    Посмотрите ComponentOne Excel .Net
    Ответ написан
    Комментировать
  • Работа с ini-файлами?

    @Sumor
    Если только Windows, то есть winapi функция GetPrivateProfileString, которая как раз для этого и предназначена.
    Пример использования на c# GetPrivateProfileString
    Ответ написан
    Комментировать
  • Как передать в параметр ссылку, с помощью xaml?

    @Sumor
    Может стоит отказаться от конструкторов с параметрами и задавать параметры свойствами.
    Примерно так:
    <ObjectDataProvider x:Key="userDCustom" ObjectType="{x:Type local:UserData}">
                <ObjectDataProvider.ConstructorParameters>
                    <local:User>
                          <local:User.UserData>
                                 <local.User Name="MyName" />
                          </local:User.UserData>
                    </local:User>
                </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
    Ответ написан
    4 комментария
  • Проект на C# WinForm не завершается полностью после перехода между формами, как решить?

    @Sumor
    Чувствую, что вам следует прочитать про ShowDialog.
    Если вы открываете форму с помощью ShowDialog, то вторая форма открывается в модальном режиме, а первая будет ожидать кода возврата от второй формы.
    Ответ написан
    Комментировать
  • Oracle в C#: как узнать количество выбранных строк?

    @Sumor
    ExecuteReader(), возвращающий OracleDataReader, предназначен для последовательного чтения результатов запроса. В процессе работы он не знает сколько ещё данных будет. Более того, данные в Reader могут начать поступать, когда ещё не закончено выполнение запроса на сервере.
    Чтобы получить количество строк нужно либо в цикле прочитать все записи из OracleDataReader. Либо сформировать запрос типа: "Select count(*) from " + command.CommandText. И для него вызвать command.ExecuteScalar(). В результате вы получите количество строк без их передачи на клиент.
    Ответ написан
    Комментировать
  • Как подключиться к Oracle на C#?

    @Sumor
    Первый вариант — по ODBC. Драйвер ODBC.
    Второй вариант через Oracle .net провайдер. Ссылка на MSDN

    Пример из MSDN
    Ответ написан
    Комментировать
  • Использование COM объектов в Windows Service C#?

    @Sumor
    Скорее всего у пользователя, под которым запущен сервис нет прав на создание объекта.
    Если это DCOM, то права можно задать в аплете «Службы компонентов», раздела «Администрирование» Панели инструментов.
    Может так случиться, что создаваемый com-объект требует наличия GUI. Например, использует очередь сообщений, выдаёт диалоги. В этом случае служба, запущенная не от системного пользователя с установленной галочкой «Разрешить взаимодействие с рабочим столом», вероятнее всего не будет работать так как работает обычное приложение.
    Ответ написан
    2 комментария
  • Как приостановить туннелирование события в WPF?

    @Sumor
    В вашем случае лучше использовать сканер в режиме работы com-порта.
    Либо изменить логику программы так, чтобы сканер просто заменял клавиатуру, как это и сделано, например, в торговых точках — там данные можно ввести со сканера, а можно набить руками.

    Что касается введённых символов, то вы их можете все запоминать и все не пропускать, а после того как разберётесь что с ними делать ввод данных можно эмулировать через SendInput. Но этот путь некрасив, ведёт к ошибкам, особенно при использовании спецсимволов или быстрых клавиш.
    Ответ написан
    Комментировать
  • C# и странная работа regexp?

    @Sumor
    Нумерация группировок не учитывает знак «ИЛИ». Первая группировка всегда первая, а вторая — вторая, не зависимо от того что именно отработало в регулярном выражении.
    Посмотрите на этот код:
    Regex rg = new Regex("a(a)|b(b)");            
    Console.WriteLine(rg.Match("aa"));
    Console.WriteLine(rg.Match("aa").Groups[1].Value);
    Console.WriteLine(rg.Match("bb"));
    Console.WriteLine(rg.Match("bb").Groups[1].Value);
    Console.WriteLine(rg.Match("bb").Groups[2].Value);

    Его вывод:
    aa
    a
    bb
    
    b
    Ответ написан
  • Как в WPF создать кнопку, при наведении на которую, под текстом появилась горизонтальная черта?

    @Sumor
    В качестве промежуточного решения может подойти следующее.
    <Button >            
        <Run>
            <Run.Style>
                <Style TargetType="Run">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="TextDecorations" Value="Underline" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Run.Style>
            Текст
        </Run>
    </Button>
    Ответ написан
    2 комментария
  • Как связать данные из списка с DataGridView с помощью bindingSource.DataSource?

    @Sumor
    С классом и привязкой всё нормально. У вас ошибка в описании отображения в DataGridView. Поэтому нужен Xaml для определения вашей ошибки.
    Ответ написан
    Комментировать
  • Кто может подсказать статью либо книгу, где хорошо описывается статика C#?

    @Sumor
    Собственно всё описано в MSDN
    Статические классы и статические методы класса

    Технически, статические члены класса это члены, которые живут своей жизнью независимо от объектов этого класса. Если весь класс состоит из таких классов, то его можно и нужно также обозначить статическим.
    Пример использований:
    0. static void Main(){}
    1. Реализация шаблона синглтон — поддержка одного объекта на процесс. Можно даже реализовать единственный объект через статический класс, хотя я бы так не делал.
    2. Глобальные параметры объектов. Например, количество созданных объектов или коллекция объектов.
    3. Статический класс, содержащий параметры проекта, константы или глобальные переменные проекта, а также методы верификации, трассировки и тп, не привязанные к конкретному классу.
    4. Методы расширения реализуются через статические методы. см. MSDN
    Ответ написан
    1 комментарий
  • WPF "проглатывает" исключения. Куда копать?

    @Sumor
    Ошибки Binding проглатываются — это действительно фишка WPF. Они пишутся в выход отладчика с описанием ошибки.
    Для отлова ошибок можно использовать событие BindingComplete, примерно, как это описано у Microsoft.
    Пример отлова ошибок Binding.

    Помимо этого есть интересный механизм проверки значений ValidationRule.
    Пример использования ValidationRule
    Ответ написан
    1 комментарий
  • Как реализовать мгновенную фильтрацию DataGrid'a, используя многопоточность (WPF)?

    @Sumor
    Вам не нужно для фильтрации пересобирать коллекцию. Для этого в wpf уже разработаны нужные механизмы.
    В первую очередь нужно коллекцию с которой вы работаете поместить в CollectionView. CollectionView привязать к DataGrid.
    У CollectionView есть встроенные механизмы фильтрации — результат будет отображаться в DataGrid.
    См. Свойство Filter CollectionView.

    Для использования CollectionView обёртывается ещё в CollectionViewSource или что-то подобное. Это подробно описывается в примерах. Его можно просто описать даже в Xaml.
    Пример, примерного кода с динамическим созданием CollectionViewSource над List и фильтрацией через TextBox:
    Xaml
    <Window x:Class="WpfApplication3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="47*"/>
                <RowDefinition Height="275*"/>
            </Grid.RowDefinitions>
            <TextBox x:Name="filter" TextChanged="filter_TextChanged"/>
            <ListBox x:Name="lst" Grid.Row="1" />
        </Grid>
    </Window>


    C#
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<string> lstSource = new List<string>() { "1", "2","3" };
            viewSource = new CollectionViewSource();
            viewSource.Source = lstSource;            
            viewSource.Filter += viewSource_Filter;
            lst.ItemsSource = viewSource.View;
        }
    
        CollectionViewSource viewSource;
        void viewSource_Filter(object sender, FilterEventArgs e)
        {
            e.Accepted = ((string)e.Item).IndexOf(filter.Text) >=0;
        }
    
        private void filter_TextChanged(object sender, TextChangedEventArgs e)
        {
            viewSource.View.Refresh();
        }
    }
    Ответ написан
    2 комментария
  • В чем ошибка при связывании (binding'е) данных?

    @Sumor
    Для TwoWay нужно указывать с использованием Path или XPath.

    Попробуй так:
    //this = currentObject; 
    //typeof(this) == typeof(Reader);
    
    var indexBinding = new Binding();
    indexBinding.Mode = BindingMode.TwoWay;
    //указываю подчненный контролл как источник данных
    indexBinding.ElementName = "epubConrol";
    indexBinding.Path = new PropertyPath("SelectedIndex");
    //Очищаю свойство зависимостей и создаю привязку 
    currentObject.ClearValue(Reader.SelectedIndexProperty);
    currentObject.SetBinding(Reader.SelectedIndexProperty, indexBinding);


    На Xaml это будет выглядеть примерно так:
    <ListBox x:Name="lst1" SelectedIndex="{Binding ElementName=lst2, Path=SelectedIndex, Mode=TwoWay}">
        <system:String>1 строка</system:String>
        <system:String>2 строка</system:String>
    </ListBox>
    <ListBox Grid.Column="1" x:Name="lst2">
        <system:String>1 строка</system:String>
        <system:String>2 строка</system:String>
    </ListBox>
    Ответ написан
    4 комментария
  • Как осуществить нестандартную привязку данных к DataGrid в WPF?

    @Sumor
    Предлагаю воспользоваться не датагридом, а ItemsControl для вывода списка ваших параметров.
    Внешний ItemsControl перечисляет свойство класса типа List, второй ItemsControl — элемент этого списка типа byte[][], третий — byte[] и отображает TextBox для каждой цифры.
    За счёт связывания (Binding) вы меняя значения в текстбоксах, меняете его в свойстве вашего объекта.

    Xaml:
    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <ItemsControl x:Name="itemsData">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <ItemsControl BorderBrush="Black" BorderThickness="1" ItemsSource="{Binding}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <ItemsControl BorderBrush="Black" BorderThickness="1" ItemsSource="{Binding}">
                                        <ItemsControl.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <StackPanel  Orientation="Horizontal"/>
                                            </ItemsPanelTemplate>
                                        </ItemsControl.ItemsPanel>
                                        <ItemsControl.ItemTemplate>
                                            <DataTemplate>
                                                <TextBox Text="{Binding Path=.}" />
                                            </DataTemplate>
                                        </ItemsControl.ItemTemplate>
                                    </ItemsControl>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </Window>


    C#
    namespace WpfApplication1
    {
        /// <summary>
        /// Логика взаимодействия для MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                var my = new MyClass();
                my.Data = new List<byte[][]>();
                my.Data.Add(new byte[][] { new byte[] { 0, 1 }, new byte[] { 2, 3 }, new byte[] { 4, 5 } });
                my.Data.Add(new byte[][] { new byte[] { 6, 7 }, new byte[] { 8, 9 }, new byte[] { 10, 11 } });
                itemsData.ItemsSource = my.Data;
            }
    
        }
    
        public class MyClass
        {
            public List<byte[][]> Data
            { get; set; }
        }
    }
    Ответ написан
    Комментировать
  • Как преобразовать системное название цвета в значение цвета на C#?

    @Sumor
    System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml("Red");

    или
    System.Drawing.Color color = System.Drawing.Color.FromName("Red");

    Если нужно получить Color для Wpf, то можно сделать примерно так:
    System.Drawing.Color wfColor = System.Drawing.Color.FromName("Red");
    System.Windows.Media.Color color = System.Windows.Media.Color.FromArgb(wfColor.A,wfColor.R,wfColor.G,wfColor.B );
    Ответ написан
    Комментировать
  • Как поменять свойство родительского контрола?

    @Sumor
    Поставь у скрола свойство IsHitTestVisible в false. Тогда оно будет пропускать события от мыши сквозь себя и радиобатон нормально переключается.
    <ScrollViewer VerticalScrollBarVisibility="Auto" IsHitTestVisible="False" >
           <TextBlock TextWrapping="Wrap" Text="{Binding FirstInformation}"/>
    </ScrollViewer>


    Если есть желание возиться с событиями, то можно предложить такой вариант (но я бы так не стал делать).
    <ScrollViewer VerticalScrollBarVisibility="Auto" >
           <TextBlock TextWrapping="Wrap" Text="{Binding FirstInformation}"  MouseLeftButtonUp="TextBlock_MouseLeftButtonUp"/>
    </ScrollViewer>
    
    private void TextBlock_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
                var tb = sender as TextBlock;
                // Нужно дополнительно обложиться проверками, что типы совпадают
                ((tb.Parent as ScrollViewer).Parent as RadioButton).IsChecked = true;            
    }
    Ответ написан
    Комментировать
  • Возможно ли путь к подключаемой dll вынести в какой-нибудь внешний файл?

    @Sumor
    Неуправляемую dll можно подгружать динамически через LoadLibrary, указывая к ней путь.
    Порядок примерно такой:
    1. LoadLibrary с путём к dll.
    2. GetProcAddress получает неуправляемый указатель на функцию в dll.
    3. Marshal.GetDelegateForFunctionPointer преобразует неуправляемый указатель на функцию в делегата, который можно использовать обычным для c# способом.
    4. FreeLibrary завершает работу с dll.

    Подробнее и с примером

    Ну а с управляемыми нужно работать через класс Assembly.
    Например, загрузка сборки — Assembly.LoadFrom(string)
    Ответ написан
    Комментировать
  • Почему программа работает неверно?

    @Sumor
    Вам больше подходит цикл while, нежели for.
    По условиям задачи вам нужно сравнивать только i-ый член, ДО его прибавления к s, а вы сравниваете e с s.
    Непонятная игра с параметром a запутывает читателя, а также не даёт сумме вычислиться с точность более 100 слагаемых.
    Ответ написан