简体   繁体   中英

How delete string from stringCollection saved in settings

I'm new in this community. I've a problem: I follewed this How I can save controls created in run time in Windows Forms and the code work very well, but I've a problem when I want to delete a string from the stringCollection. I used the method stringcollection.Remove("string") inserting a valid string just stored and I've also save all with settings.default.save() but the string is not delete from string collection. Why dont it work? Please someone help me! :)

THIS IS MY CODE:

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]);
            }
        }
    }
}

I don't have time to test this at the minute, but at a quick glance it looks like you're getting your previousLocation from e.Location in your book1_MouseDown . This would be the mouse location, not the location of the control?

It looks to me like you're storing the location of the control in your StringCollection , and I assume it has some dimensions, so the mouse may not be at the top left corner of the control when MouseDown is fired.

I'd suggest looking at getting the location from sender instead of e to keep track of the control's previous location.

There's a lot of slightly odd code there! I think what you're trying to get at with the settings thing is that there is some slightly wierd behaviour when saving StringCollections to settings. Despite the fact that you can add/remove things to the collection and then call save, that wont actually do anything.

You can see that the settings object has the correct elements in the property but it doesnt do work. You also have to re-set the Property eg:

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();
    }
}

There's some slight complications to the code that I've omitted - ACollectionOfStrings is a little wrapper class that basically passes through calls to the StringCollection but is also an IEnumerable (slightly baffled that this isn't the case and also that the GetEnumerator call on String collection doesnt return an IEnumerator so you also have to wrap that aswell - what a wierd class!)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM