Сколько лет учиться на программиста?
По крайней мере одна персона будет сильно недовольна.
Я так понимаю один котик будет недоволен?
А чем интересно? Еще же ничего нет?
Потому что если корабль идёт ко дну, то смысла нет держать сотрудника, если все равно в конечном итоге придётся с ним попрощаться, потратив кучу денег для его содержания.
Я ж не имею ввиду, когда временно заказов нет на пару недель, а когда речь идёт об финансовой устойчивости компании. Тем более, что у умных компаний пара человек сидит в штате и поддерживает рабоспособность имеющегося софта, а все остальные фрилансеры, которых можно на 1-2 или 4-5 дней в неделю привлекать. В зависимости от количества задач.
Если сотрудничество многолетнее (ну там лет 10-20), то едва ли фрилансер далеко убежит. Да и при краткосрочном сотрудничестве фрилансер заказчиков пешим эротическим маршрутом не отправляет, и может вполне вернуться когда задачи появятся. Ну а нет, так незаменимых все же нет
Вот что-то за 5 часов накалякал, проблема только с кортежем, в методе swap_column, т.к. у меня net 3.5:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1 {
public class TSubItem {
public String Text { get; set; }
public int row_id { get; set; }
}
public class SubItem {
private List<TSubItem> Item = null;
public SubItem() {
Item = new List<TSubItem>();
}
public void add_subitem(String text, int row_id) {
Item.Add(new TSubItem() { Text = text, row_id = row_id });
}
public List<TSubItem> get_subitems() {
return Item;
}
}
public class Item {
public int column_id { get; set; }
public int row_id { get; set; }
public String Text { get; set; }
public SubItem subitem { get; set; }
}
public class Header {
public int column_id { get; set; }
public String Text { get; set; }
public int x { get; set; }
}
class Grid {
private List<Item> items;
private List<Header> headers;
private int y = 0;
public Grid() {
items = new List<Item>();
headers = new List<Header>();
y = 1;
}
public void add_header(String text, int x, int column_id) {
headers.Add(new Header() { Text = text, x = x, column_id = column_id });
}
public void add_item(String item, int column_id, int row_id) {
this.add_item(item, column_id, row_id, null);
}
public void add_item(String item, int column_id, int row_id, SubItem si) {
if(si != null)
items.Add(new Item() { Text = item, subitem = si, column_id = column_id, row_id = row_id });
else
items.Add(new Item() { Text = item, column_id = column_id, row_id = row_id});
}
public void swap_column(int column_id, int to_column_id) {
//https://entityframework.net/ru/knowledge-base/33545249/
//https://stackoverrun.com/ru/q/10321290
}
public void render() {
if (headers.Count <= 0 || items.Count <= 0) return;
foreach (var h in headers) {
Console.SetCursorPosition(h.x, 1);
Console.WriteLine(h.Text);
y++;
}
var r = from head in headers join item in items on head.column_id equals item.column_id select new { subitem = item.subitem, x = head.x, y = item.row_id, Text = item.Text };
foreach (var item in r) {
Console.SetCursorPosition(item.x, item.y);
Console.WriteLine(item.Text);
if (item.subitem != null) {
foreach (var subitem in item.subitem.get_subitems()) {
Console.SetCursorPosition(item.x, subitem.row_id);
Console.Write(" " + subitem.Text);
}
}
}
}
}
class Program {
static void Main(string[] args) {
SubItem si = new SubItem();
si.add_subitem("xx", 3);
si.add_subitem("yy", 4);
Grid g = new Grid();
g.add_header("Firstname", 1, 1);
g.add_header("Lastname", 30, 2);
g.add_header("Birhday", 30, 3);
g.add_item("AA", 1, 2, si);
g.add_item("BB", 2, 2);
g.add_item("CC", 1, 5);
g.render();
for(int j = 0; j < 5; j++) Console.WriteLine("");
Console.ReadKey();
Console.Clear();
g.swap_column(2, 1);
g.render();
for (int j = 0; j < 5; j++) Console.WriteLine("");
}
}
}
Дальше в WPF Grid и StackPanel:
private void Window_Loaded(object sender, RoutedEventArgs e){
StackPanel sp = new StackPanel();
for (int j = 0; j < 10; j++) sp.Children.Add(new TextBlock() { Text = "Item" + j});
this.Content = sp;
}
Только вот это StackPanel sp = new StackPanel();
в метод render() запихиваем.
Если рисовать хотите то так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Globalization;
namespace WpfApplication2 {
public class MyCTL : UIElement {
public MyCTL() {}
protected override void OnRender(DrawingContext dc)
{
dc.DrawText(new FormattedText(headers.Caption, CultureInfo.GetCultureInfo("de-de"), FlowDirection.LeftToRight, new Typeface("Times New Roman"), 15, Brushes.Black), new Point(10f, 10f));
}
}
public partial class Window1 : Window {
public Window1() {
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e) {
MyCTL m = new MyCTL();
this.Content = m;
}
}
только запихиваете в OnRender
PS. для компактного кода, в предыдущем примере переделываем так:
foreach (var item in from head in headers join item in items on head.column_id equals item.column_id select new { subitem = item.subitem, x = head.x, y = item.row_id, Text = item.Text })
Логику тестировал в консоли, чтобы быстрее отлаживаться. Я много времени потратил, т.к. хотел сделать в стиле Visual Basic 6. По событию Mouse_Down нужно вызывать метод swap_column, а там нужно использовать кортеж https://docs.microsoft.com/ru-ru/dotnet/api/system.tuple-2.... Сегодня устал, завтра продолжу.
хотел сделать в стиле Visual Basic 6.
А зачем? Кроме рвотного рефлекса VB6 ничего не вызывает.
https://docs.microsoft.com/en-us/dotnet/standard/design-gu...
ABAP каждый школьник знает, в Berufsschule изучают, 16-17 летка освоил ABAP, по окончанию получил работу, в Berufsschule пришёл из Hauptschule. ABAP это обычный Cobolо-образный язык.
Разумеется, все легко и просто. Кусок какого-то кода не то что школьник, даже я написать смогу.
Только хорошие абаперы пишут минимум кода, им платят за использование стандартных функциональных модулей, программ, знание таблиц базы данных и далее-далее.
Я так понимаю один котик будет недоволен?
-----
Нет, не котик.
А чем интересно?
-----
Недоволен будет тот у кого появится больше работы... тот кто не рекомендует...
если корабль идёт ко дну
-----
Если есть пробоина - ее надо заделывать.
Причем заделывать должен тот кто умеет.
Abap настолько суров, что его должны знать даже лехи с курсов штаплеров.
Недоволен будет тот у кого появится больше работы...
Почему и откуда появится? Тебя кто то заставляет пользовать то что не нравится?
Вообще всё равно на чём программировать, у NET есть interop. Многие компоненты делают на Си++. Там нужно рисовать сетку спомощью GDI/GDI+, если добавляеть элементы (т.е. если элимент имеет HWND), то программа будет весить очень много. Но если рисуешь в ScrollViewer, прокрутка почему-то не активируется.
Вообще всё равно на чём программировать,
Ну это может быть вам все равно.
Но мне без CallerMemberName например, будет тоскливо.
Многие компоненты делают на Си++.
Можно, но зачем, когда и на С# всё нормально работает.
Я делал сетку спомощью STATIC-элементов см. https://docs.microsoft.com/en-us/windows/win32/controls/st..., программа на STATIC вылетала, если в WPF напихать TextBlock-и https://docs.microsoft.com/ru-ru/dotnet/api/system.windows... то тоже самое произойдёт, сетку рисуют. Да я когда Terminkalender делал спомощью GridLayout, то да вставлял туда Label, но сетка и Terminkalender это разные вещи.
Я делал сетку с помощью STATIC-элементов
Всё нужно делать как положено, хотя нормального описания так пока и не нашел.
Вы главное, не торопитесь и не расстраивайтесь если сразу не получится. Там проблем просто дофига.