2015-02-27 1 views
0

Я пытаюсь отформатировать столбец «Скорость», чтобы он отображался как десятичная единица в сетке данных, которая собирает данные из текстового файла, но i Мне не повезло. вот код я пытаюсь использовать:C# Пытается форматировать данные datagridview и передавать обратно через цикл после форматирования

while ((r.Peek() != -1)) 
{ 
    string timeS = ""; 
    string speedS = ""; 
    string delimeter = "\t"; 
    string[] Time1; 
    allData = r.ReadLine(); 
    timeS = Dtime.ToString(); 
    Time1 = timeS.Split(' '); 
    timeS = Time1[1]; 
    string[] rows = allData.Split("\r".ToArray()); 

    foreach (string row in rows) 
    { 
     var items = new List<string> { timeS }; 
     items.AddRange(row.Split(delimeter.ToArray())); 
     dataset.Tables[tableName].Rows.Add(items.ToArray()); 
     speed = Convert.ToDouble(items[2]); 
     speed = speed/10; 
     items[2] = speed.ToString(); 
     Dtime = Dtime.AddSeconds(inter); 
    } 

    this.dataGridView1.DataSource = dataset.Tables[0].DefaultView; 
} 

Правильных данные собираются на «скорость», но не корректно отображается в сетке и, кажется, просто получить перезаписано вместо преобразования нужного столбца. Данные отображаются следующим образом: 15:46:20 91 154 70 309 83 6451 .. Столбец с данными '154' должен отображаться как '15 .4 '. Ура!

ответ

0

Флип эти линии вокруг:

dataset.Tables[tableName].Rows.Add(items.ToArray()); 

speed = Convert.ToDouble(items[2]); 
speed = speed/10; 
items[2] = speed.ToString(); 

Так что вы изменяете значения в массиве itemsперед тем добавить его к столу:

speed = Convert.ToDouble(items[2]); 
speed = speed/10; 
items[2] = speed.ToString(); 

dataset.Tables[tableName].Rows.Add(items.ToArray()); 

Метод Rows.Add() вызывает внутренний NewRecordFromArray, который использует отдельные элементы вашего массива для построения новой записи в DataTable. К моменту обновления массива он уже используется, и ваши обновленные значения игнорируются.

Вот петля в NewRecordFromArray, где он создает новую запись («значение» это массив):

for (int index = 0; index < value.Length; ++index) 
{ 
    if (value[index] != null) 
     this.columnCollection[index][record] = value[index]; 
    else 
     this.columnCollection[index].Init(record); 
} 

Кроме того, я думаю, что juharr был прав о вызове ToArray(), так что есть технически две вещи, которые препятствуют сохранению измененных значений в новой записи.

+0

Я думал, что 'ToArray' собирается создать копию, но я не удивлюсь, если бы и' Add' тоже сделал. – juharr

+0

О, да, я уверен, вы правы, что 'ToArray()' создает копию ... не думал об этом. –

+0

Это действительно сработало, Cheers Grant, всегда простые вещи! – Ben

1

Вы должны сделать изменения, прежде чем положить значения в dataset

foreach (string row in rows) 
{ 
    var items = new List<string> { timeS }; 
    items.AddRange(row.Split(delimeter.ToArray())); 
    speed = Convert.ToDouble(items[2]); 
    speed = speed/10; 
    items[2] = speed.ToString(); 
    dataset.Tables[tableName].Rows.Add(items.ToArray()); 
    Dtime = Dtime.AddSeconds(inter); 
} 

The ToArray создает новый массив с текущими значениями в вашем items списке. Затем вы изменяете значение в этом списке, что не влияет на dataset.

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