Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40

Вывод результата исходя из желаний пользователя

30.07.2021, 20:26. Показов 7506. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, форумчане. Извините за некорректную постановку вопроса в заголовке, очень тяжело придумать правильное название темы.

Собственно суть темы:
Я имею в одной форме datagridview, в котором содержатся данные, вот в таком виде (привожу скрин).

В этой форме пользователь заполняет данные о разных показателях для бухгалтерского счёта некоторой организации, затем по нажатию кнопки "сохранить" сохраняет показатели каждого элемента в XML, для последующей работы с сохраненной организацией.

Так вот. Как вы могли заметить здесь есть различные показатели.
Так же мы имеем форму "Коэффициенты" (скрин 2), который содержит в себе список вероятных коэффициентов (расчётов).

Есть несколько "дефолтных" коэффициентов, которые рассчитывают результат некоторой формулы, так, например,
Code
1
Коэффициент автономии = (Уставный капитал - Собственные акции, выкупленные у акционеров + Переоценка внеоборотных активов + Добавочный капитал + Резервный капитал + Нераспределенная прибыль - непокрытый убыток) / БАЛАНС (Строка 1700)
Так же пользователь может нажать в списке выбора коэффициентов на любую из строк в ListView (тот же скрин 2), после чего появится форма, на которой можно увидеть готовую формулу выбранного коэффициента и, при необходимости, ее изменить.

В изменении (либо создании новой) формулы необходимо создать выбор предлагаемых элементов формулы: статей баланса (на основе которых коэффициент и высчитывается) а также математических знаков, т.е. сочитаем мы резервный капитал с нераспределенной прибылью или же вычитаем, либо умножаем, быть может.

Собственно ряд вопросов:
1. Как правильно реализовать создание коэффициента, как правильно получает данные необходимых строк.
2. Возможно ли создать удобный конструктор формул для пользователя и как реализовать это?

Я не прошу выполнить работу за меня, я лишь прошу рассуждений неравнодушных.
Буду благодарен каждому, кто хоть подаст идею, и, может быть, покажет свой пример. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.07.2021, 20:26
Ответы с готовыми решениями:

Запрос и ввод имени пользователя, сравнение с текущим логическим именем пользователя и вывод результата
нужна помощь! 5. Запрос и ввод имени пользователя, сравнение с текущим логическим именем пользователя и вывод сообщения: верно/неверно. ...

Сделать вывод информации о новости, исходя из данных о имени пользователя и id категории
Доброго времени суток. Хочу сделать вывод информации о новости исходя из данных о имени пользователя и id категории. Это файл...

Вывод результата в файл, при переводе чисел по выбору пользователя
У меня задача заключалась в том, чтобы осуществить считывание десятичных чисел, записанных через запятую в файле и сделать перевод в...

62
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
02.08.2021, 17:52
Студворк — интернет-сервис помощи студентам
AviacionnyUser, я настырный
Цитата Сообщение от AviacionnyUser Посмотреть сообщение
Пользователь ввёл
Куда? В то самое окно "Редактора коэффициентов"?
Цитата Сообщение от AviacionnyUser Посмотреть сообщение
пользователь выбирает сам какие компоненты с какими компонентами скрещать и с помощью каких операторов это делать
От куда и каким образом эти компоненты появятся?
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
02.08.2021, 17:57  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
я настырный
Я вижу
Цитата Сообщение от wizard41 Посмотреть сообщение
Куда? В то самое окно "Редактора коэффициентов"?
Нет, изначально вводил в "новые данные", а потом это сохранилось в XML. Соответственно мы потом значения получим из заполненного XML. (Можно даже посмотреть как я получаю данные предприятия из xml, посмотрите код формы "Сохраненные данные")
Цитата Сообщение от wizard41 Посмотреть сообщение
От куда и каким образом эти компоненты появятся?
думаю надо затолкать компоненты в combobox, операторы тоже, наверное, в combobox, чтобы пользователь выбирал и компонент и оператор из всплывающего меню. После выбора оператора должна быть возможность добавить еще один комбобокс с компонентами.

Ну вообще по этому пункту я открыт к обсуждению
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
02.08.2021, 18:11
AviacionnyUser, объясните происхождение (назначение)
Этого

и этого

в свете своих последних рассуждений.
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
02.08.2021, 18:14  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
объясните происхождение
Объясняю: туфта это, без реализации и даже без попыток реализации, на это даже смотреть не стоит.
Цитата Сообщение от wizard41 Посмотреть сообщение
в свете своих последних рассуждений.
вообще уже голова расплывается честно говоря после всех рассуждений))
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
02.08.2021, 21:21
AviacionnyUser, вот теперь мы пришли к некоему консенсусу. Это радует.

Добавлено через 2 часа 55 минут
AviacionnyUser, давайте отдохнем немного. А потом продолжим.

Добавлено через 3 минуты
А над Камчаткой погода не очень, опять туман.... (с) гр. "Любэ"
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
03.08.2021, 01:20
Мне лень все это перечитывать, поэтому спрошу в лоб -- "обратную польскую нотацию" упоминали? По сути вам нужно написать свой калькулятор (без шуток).
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
03.08.2021, 11:04
если используются только примитивные математические операции+-/*(), то можно обойтись
C#
1
DataTable.Compute()
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
03.08.2021, 12:31  [ТС]
Цитата Сообщение от Diamante Посмотреть сообщение
если используются только примитивные математические операции+-/*(), то можно обойтись
Ах и увы, не все ограничивается DataTable'ом, спасибо))

Цитата Сообщение от Wolfdp Посмотреть сообщение
"обратную польскую нотацию" упоминали?
А зачем мухе велосипед???

upd: Нет, действительно, возможно это пригодится (я сомневаюсь), но пока еще до расчётов даже дело не дошло

Добавлено через 1 минуту
Цитата Сообщение от wizard41 Посмотреть сообщение
А над Камчаткой погода не очень, опять туман
Черные фары у соседних ворот, люки, наручники, порванный рот... (с) ДДТ
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
03.08.2021, 12:48
Цитата Сообщение от Wolfdp Посмотреть сообщение
По сути вам нужно написать свой калькулятор (без шуток)
На языке вертелось, но сказали вы )
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
03.08.2021, 19:24
AviacionnyUser, так что у нас с коэффициентами в итоге? Они прилетают от куда-то и НЕ редактируются в теле программы?
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
03.08.2021, 19:30  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Они прилетают от куда-то
Коэффициенты строим дефолтные и есть возможность добавить новые. Компоненты из которых расчитывается коэффициент прилетают от ввода пользователя (сохранены в XML).

Цитата Сообщение от wizard41 Посмотреть сообщение
и НЕ редактируются в теле программы?
Дефолтные можно и запретить редактировать (хотя это вовсе не обязательно), а новые (кастомные) обязательно должны быть возможны для редактирования.
Вернее будет сказать, что коэффициент редактировать мы действительно НЕ будем, а вот формулу его расчёта будем

Я бы уже пример бы какой нибудь сделал нормальный, но у меня в голове всё еще не созрело ничего адекватного. Не быть мне архитектором
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
03.08.2021, 19:38
AviacionnyUser, простите за тавтологию: мы создаем формулу из коэффициентов или для коэффициентов. Если второе, то от куда берем исходные данные? Т.е. что мы выбираем из лист-бокса?
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
03.08.2021, 19:45  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
мы создаем формулу из коэффициентов или для коэффициентов
Создаем формулу ДЛЯ расчёта коэффициентов ИЗ компонентов.
Цитата Сообщение от wizard41 Посмотреть сообщение
от куда берем исходные данные
Из значений компонентов, которые указал пользователь (значения, которые в xml сохранены)
Цитата Сообщение от wizard41 Посмотреть сообщение
что мы выбираем из лист-бокса?
Из ListView мы выбираем коэффициент (в listview отображается лишь его название, которое задал пользователь) уже существующий для того чтобы редактировать его формулу, либо узнать его значение для конкретного предприятия.

Еще раз...
Коэффициент N = сумме или разности некоторых компонентов.
Каких компонентов? Ответ: решает пользователь (либо по умолчанию, формулы дефолтных коэффициентов кидал выше).
Так сумме или разности? Ответ: решает пользователь. Добавляет столько компонентов сколько ему нужно и добавляет произвольные значения по желанию и расставляет между этими компонентами операции сложения, либо вычитания, либо умножения, либо деления, либо скобки.

Надеюсь всё уточнил.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
03.08.2021, 21:36
Цитата Сообщение от AviacionnyUser Посмотреть сообщение
Из значений компонентов
Вы ввели новое понятие "компонент", которое все разъяснило. Для этого мне потребовалось написать n-нное количество постов
Понятно. Попробуем что-нибудь соорудить.

Добавлено через 1 час 45 минут
AviacionnyUser, допустим, введено выражение:
Code
1
Коэффициент автономии = (Уставный капитал - Собственные акции, выкупленные у акционеров + Переоценка внеоборотных активов + Добавочный капитал + Резервный капитал + Нераспределенная прибыль - непокрытый убыток) / БАЛАНС (Строка 1700)
Вы уже подумали над тем, как это вычислять? Наверное нет.
Но, подумал я. Добавьте в проект вот этот класс:
Класс RPN

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
class RPN
    {
        //Метод возвращает true, если проверяемый символ - разделитель ("пробел" или "равно")
        static private bool IsDelimeter( char c )
        {
            if ( ( " =".IndexOf( c ) != -1 ) )
                return true;
            return false;
        }
 
        //Метод возвращает true, если проверяемый символ - оператор
        static private bool IsOperator( char с )
        {
            if ( ( "+-/*^()".IndexOf( с ) != -1 ) )
                return true;
            return false;
        }
 
        //Метод возвращает приоритет оператора
        static private byte GetPriority( char s )
        {
            switch ( s )
            {
                case '(': return 0;
                case ')': return 1;
                case '+': return 2;
                case '-': return 3;
                case '*': return 4;
                case '/': return 4;
                case '^': return 5;
                default: return 6;
            }
        }
 
        
        static public double Calculate( string input )
        {
            string output = GetExpression( input ); //Преобразовываем выражение в постфиксную запись
            double result = Counting( output ); //Решаем полученное выражение
            return result;
        }
 
        static private string GetExpression( string input )
        {
            string output = string.Empty; //Строка для хранения выражения
            Stack<char> operStack = new Stack<char>(); //Стек для хранения операторов
 
            for ( int i = 0; i < input.Length; i++ ) //Для каждого символа в входной строке
            {
                //Разделители пропускаем
                if ( IsDelimeter( input[ i ] ) )
                    continue; //Переходим к следующему символу
 
                //Если символ - цифра, то считываем все число
                if ( Char.IsDigit( input[ i ] ) ) //Если цифра
                {
                    //Читаем до разделителя или оператора, что бы получить число
                    while ( !IsDelimeter( input[ i ] ) && !IsOperator( input[ i ] ) )
                    {
                        output += input[ i ]; //Добавляем каждую цифру числа к нашей строке
                        i++; //Переходим к следующему символу
 
                        if ( i == input.Length ) break; //Если символ - последний, то выходим из цикла
                    }
 
                    output += " "; //Дописываем после числа пробел в строку с выражением
                    i--; //Возвращаемся на один символ назад, к символу перед разделителем
                }
 
                //Если символ - оператор
                if ( IsOperator( input[ i ] ) ) //Если оператор
                {
                    if ( input[ i ] == '(' ) //Если символ - открывающая скобка
                        operStack.Push( input[ i ] ); //Записываем её в стек
                    else if ( input[ i ] == ')' ) //Если символ - закрывающая скобка
                    {
                        //Выписываем все операторы до открывающей скобки в строку
                        char s = operStack.Pop();
 
                        while ( s != '(' )
                        {
                            output += s.ToString() + ' ';
                            s = operStack.Pop();
                        }
                    }
                    else //Если любой другой оператор
                    {
                        if ( operStack.Count > 0 ) //Если в стеке есть элементы
                            if ( GetPriority( input[ i ] ) <= GetPriority( operStack.Peek() ) ) //И если приоритет нашего оператора меньше или равен приоритету оператора на вершине стека
                                output += operStack.Pop().ToString() + " "; //То добавляем последний оператор из стека в строку с выражением
 
                        operStack.Push( char.Parse( input[ i ].ToString() ) ); //Если стек пуст, или же приоритет оператора выше - добавляем операторов на вершину стека
 
                    }
                }
            }
 
            //Когда прошли по всем символам, выкидываем из стека все оставшиеся там операторы в строку
            while ( operStack.Count > 0 )
                output += operStack.Pop() + " ";
 
            return output; //Возвращаем выражение в постфиксной записи
        }
 
        static private double Counting( string input )
        {
            double result = 0; //Результат
            Stack<double> temp = new Stack<double>(); //Dhtvtyysq стек для решения
 
            for ( int i = 0; i < input.Length; i++ ) //Для каждого символа в строке
            {
                //Если символ - цифра, то читаем все число и записываем на вершину стека
                if ( Char.IsDigit( input[ i ] ) )
                {
                    string a = string.Empty;
 
                    while ( !IsDelimeter( input[ i ] ) && !IsOperator( input[ i ] ) ) //Пока не разделитель
                    {
                        a += input[ i ]; //Добавляем
                        i++;
                        if ( i == input.Length ) break;
                    }
                    temp.Push( double.Parse( a ) ); //Записываем в стек
                    i--;
                }
                else if ( IsOperator( input[ i ] ) ) //Если символ - оператор
                {
                    //Берем два последних значения из стека
                    double a = temp.Pop();
                    double b = temp.Pop();
 
                    switch ( input[ i ] ) //И производим над ними действие, согласно оператору
                    {
                        case '+': result = b + a; break;
                        case '-': result = b - a; break;
                        case '*': result = b * a; break;
                        case '/': result = b / a; break;
                        case '^': result = double.Parse( Math.Pow( double.Parse( b.ToString() ), double.Parse( a.ToString() ) ).ToString() ); break;
                    }
                    temp.Push( result ); //Результат вычисления записываем обратно в стек
                }
            }
            return temp.Peek(); //Забираем результат всех вычислений из стека и возвращаем его
        }
    }

Проверим его работу:
C#
1
2
3
4
5
6
7
8
9
10
11
        static void Main( string[] args )
        {
            RPN rpn = new RPN();
 
            //Проверим выражения:
            Console.WriteLine( RPN.Calculate( "2 + (4 * 2)" ) ); //10
            Console.WriteLine( RPN.Calculate( "2 * 3 + (10 / 5)" ) ); //8
            Console.WriteLine( RPN.Calculate( "(5 + 6 - 3) / 4" ) ); //2
 
            Console.Read();
        }
Вывод:
Code
1
2
3
10
8
2
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
04.08.2021, 14:41  [ТС]
wizard41, это хороший класс, хороший функционал. По прежнему вопрос остается актуальным о конструкторе. Понимаете ли, реализовать процесс расчёта я вполне в состоянии (хотя и не спорю, что RPN, который вы ввели в эту тему, намного безупречнее, чем любой другой аналог, который я бы смог придумать для расчёта).
Мне нужна помощь именно в реализации конструктора коэффициентов. Чтобы можно было буквально строить "по кирпичикам" компоненты с операторами в ряд (а уже после этого делать расчёт).

Вероятно, у нас разный подход к построению процессов, у вас, если угодно Code-First, а мне б View-First и от этого отталкиваться
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
04.08.2021, 15:23
Цитата Сообщение от AviacionnyUser Посмотреть сообщение
у вас, если угодно Code-First
Именно так.
Цитата Сообщение от AviacionnyUser Посмотреть сообщение
Мне нужна помощь именно в реализации конструктора коэффициентов
Я помню про это. Класс привел, так сказать, "чтобы было"

Добавлено через 25 минут
AviacionnyUser,
вообще то, начало положено еще в этом моем посте. Добавьте кнопок /*=, отмена, стереть и т.п. В листбоксе уже не коэффициенты, а компоненты.
Таким же образом можно переделать и второй мой пример.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
05.08.2021, 12:13
AviacionnyUser, и снова здравствуйте.
Вот эти списки явно напрашиваются в Dictionary

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
List<string> data = new List<string>()
                    {
                    "АКТИВ I. ВНЕОБОРОТНЫЕ АКТИВЫ"
                    ,"Нематериальные активы"
                    ,"Результаты исследований и разработок"
                    ,"Нематериальные поисковые активы"
                    ,"Материальные поисковые активы"
                    ,"Основные средства"
                    ,"Доходные вложения в материальные ценности"
                    ,"Финансовые вложения"
                    ,"Отложенные налоговые активы"
                    ,"Прочие внеоборотные активы"
                    ,"Итого по разделу I"
                    ,"II. ОБОРОТНЫЕ АКТИВЫ"
                    ,"Запасы"
                    ,"Налог на добавленную стоимость по приобретенным ценностям"
                    ,"Дебиторская задолженность"
                    ,"Финансовые вложения (за исключением денежных эквивалентов)"
                    ,"Денежные средства и денежные эквиваленты"
                    ,"Прочие оборотные активы"
                    ,"Итого по разделу II"
                    ,"БАЛАНС"
                    ,"ПАССИВ III. КАПИТАЛ И РЕЗЕРВЫ"
                    ,"Уставный капитал (складочный капитал, уставный фонд, вклады товарищей)"
                    ,"Собственные акции, выкупленные у акционеров"
                    ,"Переоценка внеоборотных активов"
                    ,"Добавочный капитал(без переоценки)"
                    ,"Резервный капитал"
                    ,"Нераспределенная прибыль (непокрытый убыток)"
                    ,"Итого по разделу III"
                    ,"IV. ДОЛГОСРОЧНЫЕ ОБЯЗАТЕЛЬСТВА"
                    ,"Заемные средства"
                    ,"Отложенные налоговые обязательства"
                    ,"Оценочные обязательства"
                    ,"Прочие обязательства"
                    ,"Итого по разделу IV"
                    ,"V. КРАТКОСРОЧНЫЕ ОБЯЗАТЕЛЬСТВА"
                    ,"Заёмные средства"
                    ,"Кредиторская задолженность"
                    ,"Доходы будущих периодов"
                    ,"Оценочные обязательства"
                    ,"Прочие обязательства"
                    ,"Итого по разделу V"
                    ,"БАЛАНС"
                    };
 
            List<string> keys = new List<string>()
            {
                "","1110", "1120","1130", "1140","1150","1160",
                "1170","1180","1190","1100","","1210","1220",
                "1230","1240","1250","1260","1200","1600",
                "","1310","1320","1340","1350","1360","1370",
                "1300","","1410","1420","1430","1450","1400",
                "","1510","1520","1530","1540","1550","1500","1700"
            };

Зачем вот это сохранять в файл, если это жестко прописанные константы в программе:
Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
 <Наименование_x0020_показателя>АКТИВ I. ВНЕОБОРОТНЫЕ АКТИВЫ</Наименование_x0020_показателя>
  </Cell>
  <Cell>
    <Наименование_x0020_показателя>Нематериальные активы</Наименование_x0020_показателя>
    <Код_x0020_строки>1110</Код_x0020_строки>
  </Cell>
  <Cell>
    <Наименование_x0020_показателя>Результаты исследований и разработок</Наименование_x0020_показателя>
    <Код_x0020_строки>1120</Код_x0020_строки>
  </Cell>

Все еще остается открытым вопрос - от куда берутся численные значения этих компонент?
Вот тут "123" от куда взялось?
Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
<Cell>
    <Наименование_x0020_показателя>Основные средства</Наименование_x0020_показателя>
    <Код_x0020_строки>1150</Код_x0020_строки>
    <На_x0020_29_x0020_июля_x0020_2021_x0020_г.>123</На_x0020_29_x0020_июля_x0020_2021_x0020_г.>
  </Cell>
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3450 / 2771 / 575
Регистрация: 04.09.2018
Сообщений: 8,712
Записей в блоге: 3
05.08.2021, 15:01
Цитата Сообщение от AviacionnyUser Посмотреть сообщение
Мне нужна помощь именно в реализации конструктора коэффициентов. Чтобы можно было буквально строить "по кирпичикам" компоненты с операторами в ряд (а уже после этого делать расчёт).
Так, вот вам третий вариант, более полный и понятный (должен быть).
Выкиньте из своего кода List'ы с разделами и компонентами и замените на вот этот словарь:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Словарь набора показателей
        readonly Dictionary<string, Dictionary<string, string>> dItems = new Dictionary<string, Dictionary<string, string>>()
        {
            { "I. АКТИВ. ВНЕОБОРОТНЫЕ АКТИВЫ", new Dictionary<string, string>() {
                { "Нематериальные активы", "1110" },
                { "Результаты исследований и разработок", "1120" },
                { "Нематериальные поисковые активы", "1130" },
                { "Материальные поисковые активы", "1140" },
                { "Основные средства", "1150" },
                { "Доходные вложения в материальные ценности", "1160" },
                { "Финансовые вложения", "1170" },
                { "Отложенные налоговые активы", "1180" },
                { "Прочие внеоборотные активы", "1190" },
                { "Итого по разделу I", "1100" } } },
 
            { "II. ОБОРОТНЫЕ АКТИВЫ", new Dictionary<string, string>() {
                { "Запасы", "1210" },
                { "Налог на добавленную стоимость по приобретенным ценностям", "1220" },
                { "Дебиторская задолженность", "1230" },
                { "Финансовые вложения (за исключением денежных эквивалентов)", "1240" },
                { "Денежные средства и денежные эквиваленты", "1250" },
                { "Прочие оборотные активы", "1260" },
                { "Итого по разделу II", "1200" },
                { "БАЛАНС", "1600" } } },
 
            { "III. ПАССИВ. КАПИТАЛ И РЕЗЕРВЫ", new Dictionary<string, string>() {
                { "Уставный капитал (складочный капитал, уставный фонд, вклады товарищей)", "1310" },
                { "Собственные акции, выкупленные у акционеров", "1320" },
                { "Переоценка внеоборотных активов", "1340" },
                { "Добавочный капитал(без переоценки)", "1350" },
                { "Резервный капитал", "1360" },
                { "Нераспределенная прибыль (непокрытый убыток)", "1370" },
                { "Итого по разделу III", "1300" } } },
 
            { "IV. ДОЛГОСРОЧНЫЕ ОБЯЗАТЕЛЬСТВА", new Dictionary<string, string>() {
                { "Заемные средства", "1410" },
                { "Отложенные налоговые обязательства", "1420" },
                { "Оценочные обязательства", "1430" },
                { "Прочие обязательства", "1450" },
                { "Итого по разделу IV", "1400" } } },
 
            { "V. КРАТКОСРОЧНЫЕ ОБЯЗАТЕЛЬСТВА", new Dictionary<string, string>() {
                { "Заемные средства", "1510" },
                { "Кредиторская задолженность", "1520" },
                { "Доходы будущих периодов", "1530" },
                { "Оценочные обязательства", "1540" },
                { "Прочие обязательства", "1550" },
                { "Итого по разделу V", "1500" },
                { "БАЛАНС", "1700" } }
            }
        };

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

При показе формы Ред. Коэффициентов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public Form1()
        {
            InitializeComponent();
            List<string> Paragraph = new List<string>();
 
            foreach ( KeyValuePair<string, Dictionary<string, string>> keyValue in dItems )
            {
                Paragraph.Add( keyValue.Key );
            }
            listBox1.DataSource = Paragraph;
            tbKoeffName.Text = "Имя Коэффициента";
            tbKoeffName.Select();
        }

События первого листбокса
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void listBox1_SelectedIndexChanged( object sender, EventArgs e )
        {
            foreach ( KeyValuePair<string, Dictionary<string, string>> keyValue in dItems )
            {
                if ( listBox1.SelectedItem.ToString() == keyValue.Key )
                {
                    List<string> lines = new List<string>();
                    linesId.Clear();
 
                    foreach ( KeyValuePair<string, string> val in keyValue.Value )
                    {
                        lines.Add( val.Value + "\t" + val.Key );
                        linesId.Add( val.Value );
                    }
                    listBox2.SelectionMode = SelectionMode.None;
                    listBox2.DataSource = lines;
                    listBox2.ClearSelected();
                    listBox2.SelectionMode = SelectionMode.One;
                }
            }
        }

второго
C#
1
2
3
4
5
private void listBox2_SelectedIndexChanged( object sender, EventArgs e )
        {
            string CurrId = linesId[ listBox2.SelectedIndex ];
            textBox1.Text += string.Format( " {0} ", CurrId );
        }

События операторских кнопок
C#
1
2
3
4
5
private void bt_Click( object sender, EventArgs e )
        {
            string oprt = ( ( Button ) sender ).Text;
            textBox1.Text += string.Format( " {0} ", oprt );
        }

Получится такое:

Сейчас (для примера) в формулу вставляются коды выбранных строк из словаря. По ним как бы видно, что с чем складывается/отнимается. Где-то в глубине кода по этим "кодам строк" мы должны получать реальные числовые значения и производить математические операции над ними.
Предполагается, что данное окно редактора вызвано из Главного окна, где уже определено текущее предприятие, для которого эти формулы строятся.
Вопрос, куда и в каком формате сохранять эти формулы - так же открыт.
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
09.08.2021, 12:20  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Все еще остается открытым вопрос - от куда берутся численные значения этих компонент?
Вот тут "123" от куда взялось?
В "новых данных" пользователь ввел в строке "Основные средства" с кодом 1150.

Цитата Сообщение от wizard41 Посмотреть сообщение
Зачем вот это сохранять в файл, если это жестко прописанные константы в программе:
Потому что не продумал реализацию сериализации, которая не цепляет лишних, "константных" значений.
Просто сделал два конструктора (один вызывается без входящих параметров, "новые данные", где вызываются эти константы. Второй с входящим параметром path (путь до xml сохраненного) и десериализуется, при этом константы там не вызываются (посмотрите конструкторы в NewDataForm и станет яснее).

Цитата Сообщение от wizard41 Посмотреть сообщение
Вот эти списки явно напрашиваются в Dictionary
Я согласен, списки я сделал не в лучшем виде.

Добавлено через 2 минуты
Цитата Сообщение от wizard41 Посмотреть сообщение
Сейчас (для примера) в формулу вставляются коды выбранных строк из словаря. По ним как бы видно, что с чем складывается/отнимается. Где-то в глубине кода по этим "кодам строк" мы должны получать реальные числовые значения и производить математические операции над ними.
Предполагается, что данное окно редактора вызвано из Главного окна, где уже определено текущее предприятие, для которого эти формулы строятся.
Вопрос, куда и в каком формате сохранять эти формулы - так же открыт.
Прежде всего, спасибо, вы уже очень многое сделали.

Куда? В Application.StartupPath (директория с приложением).
В каком формате? Я думаю, что удобнее всего xml или json.
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 40
09.08.2021, 20:12  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
linesId.Clear();
Что это, где у вас это инициализируется?

Цитата Сообщение от AviacionnyUser Посмотреть сообщение
Вот эти списки явно напрашиваются в Dictionary
В голову не приходит как это по человечески перенести в ту работу c datagridview, которая уже реализована в newdataform.
Да и как это сериализовать в xml...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2021, 20:12
Помогаю со студенческими работами здесь

Заполнить массив исходя из результата побитовой проверки числа
Всем привет. Вопрос такой. Есть побитовая проверка числа. помогите довсети это дело до ума, в итоге должен выходной получиться...

Средняя температура исходя из сведений пользователя
Составить программу, которая обеспечивает ввод полученной информации, распечатку её в виде таблицы, а также распечатку информации Запись...

Вывод исходя из условия
есть таблица с полем1 и полем2 как построить запрос SELECT таким образом, что бы к выводимой таблице добавлялись 2 столбца. И если поле1...

Вывод результата: вывод результата процедуры
Добрый день, получил задание, в ходе работы не могу никак разобраться как сделать вывод результатов , а иммено через процедуру: Задание...

Вывод значения исходя из условий
помогите пожалуйста,дана таблица 2 столбика ,название и значение,количество строк от 1 до n ,нужно чтобы макрос просмотрел все значения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru