2014-10-21 6 views
0

У меня есть parentForm MainForm с кнопкой Start. Начать вызывает событие Click StartForm_Click, которое открывает дочерний файл, который принадлежит его родительскому MainForm и не имеет смысла, Start. В форме «Пуск» у меня есть кнопка «Разрешения», которая открывает немодальную форму, принадлежащую ее родительскому началу. Форма Permissions имеет кучу динамически созданных флажков. Когда я нажимаю кнопку «Изменить» в «Разрешениях», я бы хотел, чтобы разрешения разрешали обновлять флажки, которые можно просмотреть.C# Обновить дочернюю форму, принадлежащую родительской форме

Я знаю, когда я нажимаю кнопку «Изменить», файл permissions.txt обновляется соответствующим образом. Диалоговое окно пользовательского интерфейса не обновляется, чтобы отражать правильное (измененное) количество пользователей, одобренных в этой категории разрешений. Как заставить ребенка дочернего элемента, принадлежащего его родительскому персоналу, обновлять пользовательский интерфейс, когда я нажимаю кнопку «Изменить» в форме «Разрешения».

Вызов из MainForm открыть childForm Start

private void StartForm_Click(object sender, EventArgs e) 
    { 
     Start f1 = new Start(); 
     f1.Owner = this; 
     f1.Show(); 
    } 

вызова из меню Пуск, чтобы сделать разрешения childForm открыть

private void bPermissions_Click(object sender, EventArgs e) 
    { 

     Permissions af3 = new Permissions(); 
     af3.Owner = this; 
     af3.Show(); 
     WidgetLogic.getPermText(af3); 
     WidgetLogic.getDetailerPermText(af3); 
     WidgetLogic.getAdminPermText(af3); 

    } 

Различные WidgetLogic вызовы обновить permissions.txt файлы на сервере. Далее я думаю, что моя проблема:

private void bModify_Click(object sender, EventArgs e) 
    { 

     WidgetLogic.writePerm(); 

    } 

WidgetLogic здесь пишет файл. Я пробовал просто this.Refresh(); и я не могу позвонить в Start.bPermission_Click() ;. К сожалению, поскольку Start имеет права доступа, требуемые, как при запуске Start все формы для детей должны немедленно Dispose(); из-за страха пользователь наверняка что-то приглушит.

Может ли кто-нибудь указать мне в правильном направлении, пожалуйста? Я был бы искренне благодарен. Заранее большое спасибо. :-D

+0

Можете ли вы получить доступ к флажкам в форме «Разрешения» через индекс, например, * chkPerm [i] *? –

ответ

0

c# Gather checkbox.Click events for later use

Ваша логика в checkChangedPerm() не является правильным. Вы должны проверить, если флажок проверяется или не-проверено:

public static void checkChangedPerm(Object sender, EventArgs e) 
{ 
    CheckBox c = sender as CheckBox; 

    if (c.Name != null && c.Name != "") 
    { 
     StreamReader reader; 
     int count = c.Name.Count(); 
     string trimmed = c.Name.ToString(); 
     string outPut = trimmed.Remove(count - 4);    

     using (reader = new StreamReader(dataFolder + PermFile)) 
     { 
      //Here you check the state of checkbox 
      if(c.Checked == false) //add the name in permLine_ 
      { 
       trimmed = reader.ReadToEnd(); //re-use the trimmed string. Don't need a new one 

       if (!trimmed.Contains(outPut)) 
       { 
        trimmed += "\r\n" + outPut; 
        permLine_ = trimmed; 
       } 
      } 
      else //remove name from permLine_ 
      { 
       permLine_ = ""; 
       while ((trimmed = reader.ReadLine()) != null) 
       { 
        if (trimmed != outPut) 
        { 
         permLine_ += trimmed + "\r\n"; 
        }       
       } 
       if (permLine_ != "") 
       { 
        permLine_ = permLine_.Remove(permLine_.Length - 2); //trim the last \r\n 
       } 
      } 

      //Now permLine_ contains the correct string 
     } 
    }     
} 

В writePerm():

StreamWriter writer; 

if(permLine_ == "" || permLine_ == null){return;} 

foreach (Control C in this.Controls) 
{ 
    if (C.GetType() == typeof(System.Windows.Forms.CheckBox)) 
    { 
     if (!permLine_.Contains(C.Name)) 
     { 
      C.Visible = false; 
     } 
    } 
} 

using (writer = new StreamWriter(dataFolder + PermFile)) 
{ 
    writer.Write(permLine_); 
} 

Наконец, в getPermText() вам нужно добавить следующую строку кода после line = reader.ReadToEnd();

//Initialize permLine_ string with the contains of the file. 
permLine_ = line; 

и проверьте, является ли userCount равным нулю:

... 
... 
userCount = parts.Length; 

if(userCount == 0){return;} 

CheckBox[] chkPerm = new CheckBox[userCount]; 
... 
... 

EDIT

Это немного неудобно, но решение способ более простой. Я имею в виду, вам нужно обновлять файл всякий раз, когда вы нажимаете кнопку bModify. Таким образом, нет необходимости в функции checkChangedPerm() и не изменять строку permLine_ при каждом нажатии на кнопку checkbox.Просто переписать bModify_Click():

private void bModify_Click(object sender, EventArgs e) 
{ 
    StreamWriter writer; 
    string trimmed = "", outPut = ""; 
    int count; 

    foreach (Control C in this.Controls) 
    { 
     if (C.GetType() == typeof(CheckBox)) 
     { 
      if (((CheckBox)C).Checked == true) { C.Visible = false; } 
      else 
      { 
       count = C.Name.Count(); 
       trimmed = C.Name.ToString(); 
       outPut += trimmed.Remove(count - 4) + "\r\n"; 
      } 
     } 
    } 

    if (outPut != "") 
    { 
     outPut = outPut.Remove(outPut.Length - 2); //trim the last \r\n 
    } 

    using (writer = new StreamWriter(dataFolder + PermFile)) 
    { 
     writer.WriteLine(outPut); 
    } 
} 

EDIT2

Вы можете иметь функцию writePerm() в WidgetLogic Class так:

public static void writePerm(System.Windows.Forms.Form targetForm) 
{ 
    StreamWriter writer; 
    string trimmed = "", outPut = ""; 
    int count; 

    foreach (Control C in targetForm.Controls) 
    { 
     if (C.GetType() == typeof(CheckBox)) 
     { 
      if (((CheckBox)C).Checked == true) { C.Visible = false; } 
      else 
      { 
       count = C.Name.Count(); 
       trimmed = C.Name.ToString(); 
       outPut += trimmed.Remove(count - 4) + "\r\n"; 
      } 
     } 
    } 

    if (outPut != "") 
    { 
     outPut = outPut.Remove(outPut.Length - 2); //trim the last \r\n 
    } 

    using (writer = new StreamWriter(dataFolder + PermFile)) 
    { 
     writer.WriteLine(outPut); 
    } 
} 

и называют это нормально:

private void bModify_Click(object sender, EventArgs e) 
{ 
    WidgetLogic.writePerm(this); 
} 
+1

Единственной ошибкой, которую я не могу очистить, является foreach (Control C в this.Controls). ключевое слово this дает мне недопустимую ошибку в любом статическом условии. Я попытался изменить модификаторы доступа и включить C в качестве части/аналогично вызову в checkChangedPerm(). Я не смог устранить ошибку. Честно говоря, я думаю, что вся линейка foreach (Control C в этом. Controls) может вызвать у меня проблемы. Мне придется подумать об этом утром. Мой день закончен. Еще раз спасибо. Вы значительно ускоряете мой процесс. HAGD !! : -D Я буду держать тебя в курсе. –

+1

О, я не думаю, что мне когда-нибудь придется беспокоиться о пользователе. Если я позволю им попробовать, они сломают его, и я должен это исправить. Это именно то, что я хочу. :-D –

+1

Извините, я пропустил это. Я бил головой о стену в течение часа. Я пытаюсь сохранить writePerm() в WidgetLogic. В вашем правиле говорится, что решение состоит в том, чтобы сохранить код в bModify_Click(). На данный момент я не понимаю, почему я ((EDIT: REMOVE not)) хочу, чтобы кнопка изменения в WidgetLogic.cs. На самом деле он никогда не будет использоваться где-либо еще, и это должно его решить. Обработка .... –

1

O к. Brilliant. Огромное спасибо всем многим темам. Особенно благодарю вас за @ γηράσκω δ 'αεί πολλά διδασκόμε

В конечном счете этот человек ставит многие полезные ответы прямо передо мной. Я нашел последний ответ более по-моему, прежде всего в надежде на использование кода в проекте. Сначала вызывается через кнопку на главной форме. Разрешения - WidgetLogic.writePerm (this); поэтому форма должна быть повторена для изменения соответствующих флажков. В это время флажки удаляются из формы и недоступны для пользователя.

public static void writePerm(System.Windows.Forms.Form targetForm) 
    { 
     StreamWriter writer; 
     string trimmed = "", outPut = ""; 
     int count; 

     foreach (Control C in targetForm.Controls) 
     { 
      if (C.Name.Contains("Perm")) 
      { 

       if (C.GetType() == typeof(CheckBox)) 
       { 
        if (((CheckBox)C).Checked == true) 
        { 
         C.Visible = false; 
        } 

        else 
        { 
         count = C.Name.Count(); 
         trimmed = C.Name.ToString(); 
         outPut += trimmed.Remove(count - 4) + "\r\n"; 
        } 
       } 
      } 
     } 

     if (outPut != "") 
     { 
      outPut = outPut.Remove(outPut.Length - 2); //trim the last \r\n 

     } 

     using (writer = new StreamWriter(dataFolder + PermFile)) 
     { 

      writer.Write(outPut); 
     } 
    } 

Как первоначально написано это проверило все элементы управления (включая метки, кнопку и т.д.), если они были флажками и протекали соответственно.

написав еще один простой, если()

if (C.Name.Contains("Perm")) 

, которая проверяет только те флажки, которые имеют строку «Пермь» добавляемый к checkbox.Name. «Perm» был добавлен во время выполнения к флажку. Имя с UserID как свойство checkbox.Name.

Мне также пришлось изменить с writer.WriteLine (output) на writer.Write (output). Это удалило окончательный \ r \ n, который автоматически добавлялся к файлу, который, в свою очередь, создал бесполезные и Безымянные флажки.

Работает как очарование. Еще раз спасибо @ γηράσκω δ 'αεί πολλά διδασκόμε Блестящий. Я очень ценю ваше терпение и помощь в этом. Направил меня в правильном направлении. Требовалось, чтобы я действительно копался, чтобы понять все, что происходило.

Имейте Awesome Day !! :-D

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