Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > MVS 2008 - проблема


Автор: okaton 24.10.2008, 11:27
Почему в 2008 студии не получается совершить такое действие:

Цитата

 Дважды щелкаем по файлу Settings.settings в Solution Explorer и добавляем настройку с некоторым именем (в данном примере с именем «ColsOrder») в список. В колонке «Type» настройки нужно указать «System.Int32[]» ...


в 2005 получается, как же это сделать в 2008    smile 

Автор: diadiavova 24.10.2008, 11:56
В VS2008 в свойствах проекта есть вкладка Settins все настройки выполняются там.

Автор: okaton 24.10.2008, 12:09
Немного переформулирую вопрос.
В установках не получается задать тип «System.Int32[]».  Обратите внимание на массив. Его там конечно нет, но если в 2005 в строке выбора "вручную" задать «System.Int32[]», она его подключит.  А вот в 2008 ругается и не не подключает. Что делать?

Автор: diadiavova 24.10.2008, 12:29
Целочисленный массив можно преобразовать в строку, разделить числа запятыми. А студия правда ругается - наверно больше не поддерживается такая возможность.

Автор: okaton 24.10.2008, 12:38
То есть таку штуку сделать не получится?

Q. Хотелось бы сохранять расположение колонок при выходе из приложения или закрытии окна и восстанавливать его при открытии. По умолчанию grid этого не делает. Можно это как-то поправить?

A. Можно, причем вариантов масса. Один из:

Дважды щелкаем по файлу Settings.settings в Solution Explorer и добавляем настройку с некоторым именем (в данном примере с именем «ColsOrder») в список. В колонке «Type» настройки нужно указать «System.Int32[]» (в выпадающем списке типов выбрать пункт «Browse...» и в появившемся диалоге вписать указанный тип). В колонке «Scope» указать – «User».

Далее пишем две функции сохранения и восстановления порядка колонок (вместо DefNamespace нужно подставить имя пространства имен используемого по умолчанию в данном проекте):

Код

public static void LoadColumnsOrder(DataGridView grid, string settingsEntry)
{
  int[] displayIndexes = (int[])
    DefNamespace.Properties.Settings.Default[settingsEntry];

  if (displayIndexes == null || displayIndexes.Length != grid.Columns.Count)
    return;

  for (int i = 0; i < grid.Columns.Count; i++)
    grid.Columns[i].DisplayIndex = displayIndexes[i];
}


Код

public static void SaveColumnsOrder(DataGridView grid, string settingsEntry)
{
  int[] displayIndexes = new int[grid.Columns.Count];

  for (int i = 0; i < grid.Columns.Count; i++)
    displayIndexes[i] = grid.Columns[i].DisplayIndex;

  DefNamespace.Properties.Settings.Default[settingsEntry] = displayIndexes;
}


Вызываем первую при загрузке формы:

Код

private void Form1_Load(object sender, EventArgs e)
{
  // "ColsOrder" – это имя настройки в файле Settings.settings
  LoadColumnsOrder(dataGridView1, "ColsOrder");
}


А вторую – при закрытии:

Код

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
  SaveColumnsOrder(dataGridView1, "ColsOrder");
  WindowsApplication1.Properties.Settings.Default.Save();
}



http://www.rsdn.ru/article/dotnet/DataGridView20part2.xml

Автор: diadiavova 24.10.2008, 14:06
Я бы сосредоточился на фразе
Цитата(okaton @  24.10.2008,  12:38 Найти цитируемый пост)
Можно, причем вариантов масса

Не обязательно всё хранить в массиве. А статья написана в 2006 году, под студию 2005. А для того, чтобы сохранить порядок колонок без массива точно обойтись можно. Выписать индексы колонок в сторку в нужном порядке через запятую и сохранить как строку. При извлечении разбить строку на строковый массив по запятым и преобразовать строки в числа. Получится малепусенькая процедурка.

Автор: MasterOfCode 24.10.2008, 14:26
okaton, обрати внимание на советы diadiavova. Храни string параметр,
такой строчкой воспользуйся:
Код

_ColsOrders = "1,2,3,4,5,6"
string[] colsOrders = _ColsOrders.Split(',');
//colsOrders будет равняться массиву из 6 символов

Автор: diadiavova 24.10.2008, 14:46
В принципе можно использовать код из статьи, написать что-то в этом роде 
Код

string IntArrayToText(int[] colOrder)
{
    string s = "";
    foreach(int i in colOrder)
    {
        s += i.ToString() + ",";
    }
    //здесь убираем лишнюю запятую.
    //Можно наверное и поэлегантнее сделать, но для простоты и так сойдёт
    return s.Substring( 0, s.Length - 1);
}

int[] TextToIntArray(string colOrder)
{
    string[] sAr = colOrder.Split(",");
    int[] rv = new int[s.Lengnh];
    for(int i = 0; i < sAr.Length; i++)
    {
        rv[i] = (int)sAr[i];
    }
    return rv;
}

(Если в коде есть ошибки - извиняюсь я на другом языке пишу, но думаю идея понятна)
Дальше перед сохранением массива передаёмего функции IntArrayToText и сохраням уже строку. А при загрузке данных передаём преобразовываем строку в массив при помощи функции TextToIntArray, а  дальше как в статье.

Автор: okaton 24.10.2008, 16:13
diadiavovaMasterOfCode,  спасибо за помощь!

Результата я добился smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)