Это выглядит очень процедурно в концепции и полностью игнорирует значение OOD. Разумным подходом было бы создание объектов для каждого из ваших элементов, а значения, которые вы дали, были бы свойствами этих объектов, то есть
class PropertiesPanel
{
public string DataFile { get; set; }
public DataSet DataSet { get; set; }
public string[] DataIDColumn { get; set; }
etc...
Я думаю, вы поняли идею, поэтому я не собираюсь все печатать. Это первый этап, и может потребоваться дополнительная работа для правильной структуризации приложения.
Лучший совет, который я когда-либо получал для OOD, заключался в поиске наименьшего объекта, к которому может быть передана каждая логическая ветвь вашего приложения, вероятно, оно имеет собственные типы для свойств (в .NET нет смысла заново изобретать объекты Framework поэтому они могут находиться в вашем базовом классе), а затем использовать наследование, полиморфизм и инкапсуляцию для расширения этих базовых классов, пока у вас не появится объект, который инкапсулирует логическую ветвь.
В то время, когда я писал приложение, которое помещало данные на устройство I2C, я начал с класса, который помещал бит в шину I2C, который был унаследован классом, который помещает байт в шину, унаследованный класс, который помещает массив байтов на шину, и, наконец, класс, который помещает адрес и массив байтов. Это довольно экстремальный OOD, но он генерирует очень чистый код, каждый класс очень маленький и его очень легко отлаживать.
Возможно, стоит подумать о проблеме заранее, но в конечном итоге это сэкономит много времени, просто не смешно.