Как удалить строку из stringCollection сохраненной в настройках
Я новичок в этом сообществе. У меня проблема: я следовал за этим, Как я могу сохранить элементы управления, созданные во время выполнения в Windows Forms, и код работает очень хорошо, но у меня есть проблема, когда я хочу удалить строку из stringCollection. Я использовал метод stringcollection.Remove("string"), вставляющий только что сохраненную допустимую строку, и я также сохраняю все с settings.default.save(), но строка не удаляется из коллекции строк. Почему это не работает? Пожалуйста, кто-нибудь, помогите мне!:)
ЭТО МОЙ КОД:
public Form1()
{
InitializeComponent();
if (Properties.Settings.Default.StringCollection == null)
Properties.Settings.Default.StringCollection = new System.Collections.Specialized.StringCollection();
}
private void make_BookButtonAndStore(int x, int y, string name)
{
make_Book(x, y, name);
Properties.Settings.Default.StringCollection.Add(String.Format("{0};{1};{2}", book1.Location.X, book1.Location.Y, book1.Name));
Properties.Settings.Default.Save();
}
private void make_Book(int x, int y, string name)
{
// this code is initializing the book(button)
book1 = new Button();
//Image img = button1.Image;
//book1.Image = img;
book1.Name = name;
//book1.Height = img.Height;
//book1.Width = img.Width;
book1.Location = new Point(44 + x, 19 + y);
book1.MouseDown += new MouseEventHandler(book1_MouseDown);
book1.MouseMove += new MouseEventHandler(book1_MouseMove);
book1.MouseUp += new MouseEventHandler(book1_MouseUp);
groupBox1.Controls.Add(book1);
}
void book1_MouseDown(object sender, MouseEventArgs e)
{
activeControl = sender as Control;
previousLocation = e.Location;
Cursor = Cursors.Hand;
}
void book1_MouseMove(object sender, MouseEventArgs e)
{
if (activeControl == null || activeControl != sender)
return;
var location = activeControl.Location;
location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y);
activeControl.Location = location;
}
void book1_MouseUp(object sender, MouseEventArgs e)
{
activeControl = null;
Cursor = Cursors.Default;
Button btnPremuto = (Button)sender;
Properties.Settings.Default.StringCollection.Remove(previousLocation.X+";"+previousLocation.Y+";"+btnPremuto.Name);
Properties.Settings.Default.StringCollection.Add(String.Format("{0};{1};{2}", btnPremuto.Location.X, btnPremuto.Location.Y, btnPremuto.Name));
Properties.Settings.Default.Save();
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (string line in Properties.Settings.Default.StringCollection)
{
if (!String.IsNullOrWhiteSpace(line))
{
// The line will be in format x;y;name
string[] parts = line.Split(';');
if (parts.Length >= 3)
{
int x = Convert.ToInt32(parts[0]);
int y = Convert.ToInt32(parts[1]);
make_Book(x, y, parts[2]);
}
}
}
}
2 ответа
Там много немного странного кода! Я думаю, что вы пытаетесь получить доступ к настройкам, так это к некоторому странному поведению при сохранении StringCollections в настройках. Несмотря на то, что вы можете добавлять / удалять вещи в коллекции, а затем вызывать save, на самом деле это ничего не сделает.
Вы можете видеть, что объект настроек имеет правильные элементы в свойстве, но он не работает. Вы также должны повторно установить свойство, например:
public class Config
{
private readonly Settings _settings;
private readonly ACollectionOfStrings _selectedCategories;
internal Config(Settings settings)
{
_settings = settings;
if(_settings.SelectedCategories == null)
_settings.SelectedCategories = new StringCollection();
_selectedCategories = new ACollectionOfStrings(_settings.SelectedCategories);
}
public IEnumerable<string> SelectedCategories
{
get { return _selectedCategories; }
}
private void ModifySettings(Action<Settings> modification)
{
modification(_settings);
Save();
}
private void Save()
{
_settings.Save();
}
public void AddCategory(string category)
{
_selectedCategories.Add(category);
SaveList();
}
private void SaveList()
{
ModifySettings(s => s.SelectedCategories = _selectedCategories.List);
}
public void Remove(string category)
{
_selectedCategories.Remove(category);
SaveList();
}
}
В коде, который я пропустил, есть некоторые небольшие сложности - ACollectionOfStrings - это небольшой класс-обертка, который в основном проходит через вызовы StringCollection, но также является IEnumerable (слегка озадачен тем, что это не так, а также вызовом GetEnumerator для String коллекция не возвращает IEnumerator, так что вы должны также обернуть это - что за странный класс!)
У меня нет времени, чтобы проверить это в минуту, но на первый взгляд кажется, что вы получаете previousLocation
от e.Location
в вашем book1_MouseDown
, Это будет местоположение мыши, а не расположение элемента управления?
Мне кажется, что вы храните расположение элемента управления в вашем StringCollection
и я предполагаю, что он имеет некоторые размеры, поэтому мышь может не находиться в верхнем левом углу элемента управления, когда MouseDown
уволен.
Я бы посоветовал посмотреть на получение местоположения из sender
вместо e
отслеживать предыдущее местоположение элемента управления.