Multidimensional arrays are not friendly and certainly do not present easy logic to follow. Your solution dispatches with the confusion.
We can get even better and make using Json simple by following the code below and here. Make sure to look at how I created the Json here
A Class for providing a user interface to select a template
public class ConfigurationItem
{
public int Id { get; set; }
public string Name { get; set; }
public override string ToString() => Name;
}
A Class to store mappings
public class DataMapColumn
{
public int ConfigurationId { get; set; }
public string Name { get; set; }
public int Ordinal { get; set; }
public string DisplayName { get; set; }
public override string ToString() => Name;
}
File operations
public class FileOperations
{
public static readonly string ConfigurationFileName = "Configuration.json";
public static readonly string DataItemsFileName = "DataItems.json";
/// <summary>
/// Create file if not exists for list of <see cref="ConfigurationItem"/>
/// </summary>
public static void WriteConfigurationItems()
{
if (File.Exists(ConfigurationFileName)) return;
var list = new List<ConfigurationItem>
{
new ConfigurationItem() { Id = 1, Name = "First" },
new ConfigurationItem() { Id = 2, Name = "Second" }
};
File.WriteAllText(ConfigurationFileName,
JsonConvert.SerializeObject(list, Formatting.Indented));
}
/// <summary>
/// Create file if not exists for list of <see cref="DataMapColumn"/>
/// </summary>
public static void WriteDataItems()
{
if (File.Exists(DataItemsFileName)) return;
var list = new List<DataMapColumn>
{
new DataMapColumn() { ConfigurationId = 1, Name = "A1", DisplayName = "DateDate" },
new DataMapColumn() { ConfigurationId = 2, Name = "A40", DisplayName = "Prod" },
new DataMapColumn() { ConfigurationId = 1, Name = "A4", DisplayName = "Item" },
new DataMapColumn() { ConfigurationId = 1, Name = "A10", DisplayName = "Site" }
};
File.WriteAllText(DataItemsFileName,
JsonConvert.SerializeObject(list, Formatting.Indented));
}
public static List<DataMapColumn> Columns
=> JsonConvert.DeserializeObject<List<DataMapColumn>>(
File.ReadAllText(DataItemsFileName));
public static List<ConfigurationItem> Configurations
=> JsonConvert.DeserializeObject<List<ConfigurationItem>>(
File.ReadAllText(ConfigurationFileName));
}
Configuration file (generated in FileOperations)
[
{
"Id": 1,
"Name": "First"
},
{
"Id": 2,
"Name": "Second"
}
]
Mapping file (generated in FileOperations)
[
{
"ConfigurationId": 1,
"Name": "A1",
"Ordinal": 0,
"DisplayName": "DateDate"
},
{
"ConfigurationId": 2,
"Name": "A40",
"Ordinal": 0,
"DisplayName": "Prod"
},
{
"ConfigurationId": 1,
"Name": "A4",
"Ordinal": 0,
"DisplayName": "Item"
},
{
"ConfigurationId": 1,
"Name": "A10",
"Ordinal": 0,
"DisplayName": "Site"
}
]
Form to show and select a configuration
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DataGridViewColumns.Classes;
namespace DataGridViewColumns
{
public partial class ConfigForm : Form
{
private readonly List<DataMapColumn> _dataMapColumns;
public ConfigForm()
{
InitializeComponent();
FileOperations.WriteConfigurationItems();
FileOperations.WriteDataItems();
_dataMapColumns = FileOperations.Columns;
Shown += OnShown;
}
private void OnShown(object sender, EventArgs e)
{
ConfigurationsListBox.DataSource = FileOperations.Configurations;
}
private void SelectButton_Click(object sender, EventArgs e)
{
var builder = new StringBuilder();
var selected = (ConfigurationItem)ConfigurationsListBox.SelectedItem;
var result =
_dataMapColumns.Where(dataColumnMap =>
dataColumnMap.ConfigurationId == selected.Id);
foreach (var column in result)
{
builder.AppendLine($"{column.Name,-5}{column.DisplayName}");
}
textBox1.Text = builder.ToString();
}
}
}