2014-10-21 6 views
0

parentForm 주 폼에 단추 시작이 있습니다. Start는 부모 MainForm이 소유하고 모덜리스 인 Start 인 childForm을 여는 Click 이벤트 StartForm_Click을 호출합니다. 시작 폼에는 parentForm Start가 소유하는 모덜리스 폼을 여는 Permissions 버튼이 있습니다. 권한 형태에는 동적으로 생성 된 체크 박스가 많이 있습니다. 볼 수있는 확인란을 업데이트하려면 사용 권한에 대한 수정 단추를 클릭합니다.C# 부모 폼이 소유 한 자식 폼을 새로 고칩니다.

수정 버튼을 클릭하면 permissions.txt 파일이 적절하게 업데이트된다는 것을 알고 있습니다. 해당 권한 범주에서 승인 된 올바른 (수정 된) 사용자 수가 반영되도록 UI 대화 상자가 업데이트되지 않습니다. 퍼미션 폼에서 수정 버튼을 클릭하면 부모가 소유 한 아이의 아이를 UI를 업데이트하도록 어떻게 강제 할 수 있습니까? MainForm에서

전화는

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 파일을 업데이트 열 childForm 권한을 시작에서 childForm 시작

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

전화를 엽니 다. 다음으로 내 문제가 있다고 생각하는 곳입니다.

private void bModify_Click(object sender, EventArgs e) 
    { 

     WidgetLogic.writePerm(); 

    } 

여기에 WidgetLogic이 파일을 쓰고 있습니다. 나는 이것을 시도했다. 새로 고침(); Start.bPermission_Click();을 호출 할 수 없습니다. 불행히도 Start가 Permissions을 소유하고 있기 때문에 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가 0인지 확인하십시오.

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

if(userCount == 0){return;} 

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

편집

그것은 조금 당황하지만 솔루션이 방법이 더 간단합니다. 즉, 버튼 bModify을 누를 때마다 파일을 업데이트해야합니다. 따라서 checkbox을 클릭 할 때마다 checkChangedPerm() 함수가 필요 없으며 permLine_ 문자열을 변경할 필요가 없습니다.이 같은 WidgetLogic Class

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() 기능을 가질 수 있습니다 :

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

를 정상적으로 호출 : 그냥 bModify_Click()가 다시

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

내가 지울 수없는 유일한 오류는 foreach (this.Controls의 Control C)입니다. 이 키워드는 어떤 정적 조건에서도 유효한 오류가 아닙니다. 액세스 수정자를 변경하고 checkChangedPerm()에서 호출 된 것과 유사하거나 유사한 C를 포함하여 시도했습니다. 오류를 해결할 수 없습니다. 솔직히 나는 전체 라인 foreach (this.Controls 컨트롤 C)가 나를 곤란하게 만들 수 있다고 생각합니다. 나는 이것을 아침에 생각해야 할 것이다. 내 하루가 끝났어. 다시 한번 감사드립니다. 당신은 내 과정을 크게 가속화했습니다. 해가 !! :-D 당신을 계속 지켜 드리겠습니다. –

+1

아, 나는 사용자 수 0에 대해 걱정할 필요가 없을 것이라고 생각합니다. 내가 그 (것)들을 그것을 시도하게하면, 그들은 그것을 끊고 그것을 고쳐야한다. 정확히 내가 원하는 것입니다. :-D –

+1

죄송합니다. 나는 한 시간 동안 벽에 머리를 때렸다. WidgetLogic에서 writePerm()을 유지하려고합니다. 귀하의 편집은 bModify_Click()에 코드를 유지하는 것입니다. 지금은 WidgetLogic.cs에서 수정 버튼을 원한다는 이유를 알 수 없습니다 (편집 : 삭제하지 않음). 정말로 다른 어느 곳에서도 사용되지 않을 것이고 그것을 해결해야합니다. 처리 중입니다 ... –

1

O 케이. 훌륭한. 많은 스레드 덕분에 많은 감사드립니다. 특히 감사합니다 @ γηράσκω δ 'αεί πολλά διδασκόμε

궁극적으로이 사람은 많은 도움이되는 답을 저의 앞에 직접 나타냅니다. 나는 주로 프로젝트에서 코드를 더 사용하기를 희망하면서 마지막 대답이 내 마음에 들었다. 기본 폼의 버튼을 통해 처음 호출됩니다. 권한은 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); 
     } 
    } 

원래 작성된대로 모든 제어 항목 (레이블, 버튼 등 포함)은 확인란으로 선택되어 그에 따라 진행되었습니다. checkbox.Name에 추가 된 문자열 "파마"가 만 확인란을 선택 것이다

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

또 다른 간단한 경우()

를 작성하여

. 런타임에 "Perm"이 checkbox.Name 속성으로 UserID가있는 checkbox.Name에 추가되었습니다.

또한 writer.WriteLine (출력)에서 writer.Write (출력)로 변경해야했습니다. 이렇게하면 파일에 자동으로 추가 된 마지막 \ r \ n이 제거되어 값이없는 및 이름없는 체크 박스가 만들어졌습니다.

매력처럼 작동합니다. 다시 고마워. @ γηράσκω δ 'αεί πολλά διδασκόμε Brilliant. 양해 해 주시고 협조 해 주셔서 감사드립니다. 확실히 올바른 방향으로 나를 가리켰다. 계속 진행되고있는 모든 것을 이해하기 위해 정말로 파 묻을 것을 요구했습니다.

굉장한 날을 보내십시오 !! :-D

관련 문제