2014-10-20 4 views
0

Я потерян. Я хочу удалить значение из текстового файла. Значение - это checkbox.Name. Я хочу открыть текстовый файл, найти соответствующее имя пользователя в текстовом файле, удалить его и сохранить файл на основе нажатия кнопки.C# Удалить динамически созданный флажок на основе нажатия кнопки

Вот как я получаю checkbox.Name

public static void getPermText(System.Windows.Forms.Form targetForm) 
{ 
    Stream fileStream = File.Open(dataFolder + PermFile, FileMode.Open); 
    StreamReader reader = new StreamReader(fileStream); 

    string line = null; 

    line = reader.ReadToEnd(); 


    string[] parts = line.Split('\n'); 

    string user = userNameOnly(); 
    try 
    { 

     int userCount; 

     userCount = parts.Length; 

     CheckBox[] chkPerm = new CheckBox[userCount]; 
     int height = 1; 
     int padding = 10; 

     for (int i = 0; i < userCount; i++) 
     { 
      chkPerm[i] = new CheckBox(); 

      string Perm = "Perm"; 

      chkPerm[i].Name = parts[i].Trim('\r') + Perm; 

      chkPerm[i].Text = parts[i]; 

      chkPerm[i].TabIndex = i; 

      chkPerm[i].AutoCheck = true; 

      chkPerm[i].Bounds = new Rectangle(15, 40 + padding + height, 100, 22); 

      //Assigns an eventHandler to the chkPerm.CheckBox that tells you if something is clicked, then that checkBox is selected/checked. 
      //Not currently in use. 
      chkPerm[i].Click += new EventHandler(checkChangedPerm); 


      targetForm.Controls.Add(chkPerm[i]); 

      height += 22; 

      //MessageBox.Show(chkPerm[i].Name); 

     } 



    } 
    catch 
    { 

    } 
    fileStream.Close(); 

} 

я могу получить доступ к checkbox.Name на основе события щелчка, так что я знаю, что я получаю правильный checkbox.Name

public static void checkChangedPerm(Object sender, EventArgs e) 
{ 

    CheckBox c = sender as CheckBox; 

    if (c.Name != null && c.Name != "") 
    { 
     int count = c.Name.Count(); 

     string trimmed = c.Name.ToString(); 
     string outPut = trimmed.Remove(count - 4); 


    } 
    else 
    { 

    } 


} 

Я искал это большую часть утра и весь день в пятницу. Может ли кто-нибудь указать мне в правильном направлении или, возможно, предложить какой-то образец кода. Пожалуйста пожалуйста. Заранее спасибо. Я действительно ценю это. : -D

+0

Итак, похоже, что вы динамически создаете флажки на основе имен в файле. Вы можете либо открыть файл, найти строку и удалить ее, либо заново создать файл, используя то, что вы выбрали для своих флажков, за вычетом того, который вам не нужен. Я бы лично пошел со вторым вариантом, но я не уверен, как выглядит файл. Вы не знаете, как писать текстовый файл или ...? В качестве альтернативы, может быть проще использовать сериализацию в зависимости от конечной цели, поскольку вы могли бы просто десериализовать/сериализовать объект в текстовый файл по мере необходимости. – user1274820

+1

Я согласен с рекомендациями @ user1274820. В дополнение к ним, пожалуйста, не игнорируйте все исключения с пустым 'try..catch', ставьте два объекта' Stream' в 'using', чтобы убедиться, что они правильно освобождены и взглянуть на класс TextReader. прочитайте файл за строкой, а не сначала загрузите весь файл в память, это также устранит необходимость ручной обрезки символов новой строки из ваших строк. –

+0

@ user1274820 Мое замешательство, я думаю, пытается записать обратно в файл. Я могу получить событие click из флажка, который я хочу удалить, но это не дает мне других 20 флажков на странице, которые мне нужно оставить. В этом и заключается моя сложность. Думаю, я понимаю разбор текста из строки, но разбор строки из середины строки или из stringArray. Я не понимаю, думаю. –

ответ

1
StreamReader reader; 
StreamWriter writer; 

string line, newText = null; 

using (reader = new StreamReader(@"...")) 
{ 
    while ((line = reader.ReadLine()) != null) 
    { 
     if (line != "checkbox name") 
     { 
      newText += line + "\r\n"; 
     } 
    } 
} 

newText = newText.Remove(newText.Length - 2); //trim the last \r\n 

using (writer = new StreamWriter(@"...")) //same file 
{ 
    writer.Write(newText); 
} 
+0

Я бы предпочел использовать 'StringBuilder' вместо конкатенации' string' все время, тогда вы также можете использовать [StringBuilder.AppendLine (строка)] (http://msdn.microsoft.com/en-us/library/cb3sbadh%28v=vs.110%29.aspx) вместо hardcoding символов новой строки –

+0

Я бы предпочел список лично - строк – user1274820

+0

@ γηράσκωδ'αείπολλάδιδασκόμε Скопировать это Stank :-D. Обработка ..... –