2015-08-26 4 views
-1

Я пытаюсь изменить код, написанный другим джентльменом, который генерирует плоские файлы в различных форматах. Конкретный плоский файл, который является позиционным, - значение X находится в позиции 10, значение Y - 17, а значение Z - 26 и т. Д.Обновление ReadOnlyCollection в GridView

Когда пользователь нажимает кнопку «Создать файл», этот экстракт вызывается:

ReadOnlyCollection<IDataRow> dataRows = null; 
try 
{ 
    dataRows = FlatFileExporter.MerrillLynch.GetMerrillLynchData(mPostSeq, mPaycheckDate, mPayrollStartDate, mPayrollEndDate); 
} 
catch (Exception ex) 
{ 
    Response.Write((ex.InnerException != null ? ex.InnerException.Message + "; " : "") + ex.Message); 
} 

На данный момент, я знаю, что у меня есть этот ReadOnlyCollection назвали DataRows. Она была заселена из хранимой процедуры «GetMerrillLynchData» в этой процедуре:

public static ReadOnlyCollection<IDataRow> GetMerrillLynchData(string postSeq, DateTime paycheckDate, DateTime payrollStartDate, DateTime payrollEndDate) 
{ 
    string dateFormat = "MM/dd/yyyy"; 
    string query = string.Format(
     "exec GatherMerrillLynchPayrollData {0}, '{1}', '{2}', '{3}'", 
     "'" + postSeq + "'", 
     paycheckDate.ToString(dateFormat), 
     payrollStartDate.ToString(dateFormat), 
     payrollEndDate.ToString(dateFormat) 
    ); 

    return FileGenerator.GetDataRows(query, MerrillLynchMeta.Columns, dict => new MerrillLynchDataRow(dict)); 
} 

The ReadOnlyCollection будет подаваться в FlatFileGenerator, который будет выводить файл в правильном формате.

Проблема: Наш администратор Payroll Admin хочет иметь возможность вносить изменения в этот файл, прежде чем он будет FTP'd Merrill Lynch. Мне интересно, можно ли открыть и отредактировать dataRows (возможно, в GridView?), Прежде чем он будет отправлен на FlatFileGenerator. Затем, после того, как она закончит редактирование, я хочу сохранить ее правки обратно в dataRows и продолжить с кодом, как он написан.

Можно ли это сделать?

+0

да, что может быть сделано, но переполнение стека не должно быть место для «получить ваши бесплатные решения», поэтому постарайтесь немного ваш я и вернуться с реальным вопросом – Thorarins

+0

Довольно резкий ответ Thorarins. Я боролся с этим в течение двух дней, пытаясь изменить код, который намного выше моей головы. Вопрос очень реальный, и я не ищу «бесплатные решения», как вы так грубо догадываетесь. Я ищу доброе руководство от кого-то, кто не ты. – DJGray

ответ

1

Если ReadOnlyCollection - это коллекция Datarows, просто добавленная к интерфейсу IDataRow, который, вероятно, является подмножеством того класса Datarow, вы, вероятно, можете использовать коллекцию как ItemsSource в Datagrid и получить то, что получаете. После этого я предполагаю, что вы должны установить datagrid, чтобы разрешить изменения, и содержимое коллекции будет изменено. Чтобы помочь вам больше, нам нужно знать, как выполняется интерфейс IDataRow и какой тип базовой коллекции используется для ReadOnlyCollection. Если коллекция действительно ReadOnly, для ее редактирования вам, вероятно, нужно поместить ее содержимое в коллекцию не только для чтения, но и использовать ее для редактирования данных, а затем создать новый ReadOnlyCollection из измененных данных и использовать его для создания файла. НТН

+0

Сабрина, спасибо за добрый ответ. Я создам DataGrid и назначу ему dataRows как ItemsSource и посмотрю, что с ним происходит.Как я отметил Тораринам выше, это был мой подход в течение последних двух дней - немного измените его и посмотрите, что я верну. По другому предложению: я попытался сменить ReadOnlyCollection на просто Collection, и я получил ошибки сборки повсюду. Пытались преследовать их всех, но, наконец, вернулись к исходной точке. Возможно, мне придется снова пропустить этот проспект и просто приложиться к поиску проблем. – DJGray

+0

Вы не можете просто изменить ReadOnlyCollection (это, вероятно, класс, реализованный в одной из ваших библиотек тем, кто реализовал этот код) в коллекции, но вы можете создать список и добавить в этот список все элементы в вашем ReadonlyCollection или, если это позволяет ReadOnlyCollection, вы можете использовать Linq и создать свой список с помощью тафта –

1

Решение 1:

Сделайте копию чтения-записи строк данных:

return new List<IDataRow>(dataRows); 

Конечно, если вам нужно сохранить измененную коллекцию, вы должны сделать это вручную ,

Решение 2:

Если ReadOnlyCollection оборачивает нетривиальный объект коллекции BL, которая доступна для записи и поддерживает изменения всякий раз, когда коллекция обновляется, то вы, возможно, захотите извлечь оригинальную коллекцию. Это на самом деле хак, а не хорошее решение вообще:

FieldInfo wrappedCollection = dataRows.GetType().GetField("list", 
    BindingFlags.Instance | BindingFlags.NonPublic); 
return (IList<IDataRow>)wrappedCollection.GetValue(dataRows); 
+0

, да, мне нужно сохранить изменения перед передачей dataRows в FlatFileGenerator. Я работаю с предложением Сабрины в данный момент, и если я не получаю там радости, я попробую ваш «взломать» выше. Взлом в порядке, если он работает! ;-) – DJGray

Смежные вопросы