c#刷新父表单拥有的子表单

时间:2014-10-21 14:55:42

标签: c# winforms forms button permissions

我有一个带有按钮Start的parentForm MainForm。开始调用Click事件StartForm_Click,它打开一个childForm,它由它的父母MainForm拥有,并且是无模式的Start。在开始表单上,我有一个按钮Permissions,它打开一个由它的parentForm Start拥有的无模式表单。表单权限有一堆动态创建的复选框。当我单击“权限”上的“修改”按钮时,我希望“权限”更新可查看的复选框。

我知道当我单击Modify按钮时,permissions.txt文件正在适当更新。 UI对话框未更新以反映在该权限类别下批准的正确(已修改)用户数。当我单击表格权限上的“修改”按钮时,如何强制其父母拥有的孩子的孩子更新用户界面。

从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正在编写文件。我试过简单的这个.Refresh();我似乎无法调用Start.bPermission_Click();.不幸的是因为Start拥有Permissions,需要在Start关闭时所有子窗体必须立即Dispose();因为害怕用户肯定会捣乱。

有人能指出我正确的方向吗?我真诚地感激它。非常感谢你提前。 :-D

2 个答案:

答案 0 :(得分:1)

确定。辉煌。非常感谢众多线程。特别感谢@γηράσκωδ'αείπολλάδιδασκόμε

最终,这个人直接在我面前提出了许多有用的答案。我发现最后的答案更符合我的喜好,主要是希望在项目中进一步使用代码。首先通过主窗体上的按钮调用权限是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()

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

只检查那些在checkbox.Name中附加字符串“Perm”的复选框。 “Perm”在运行时添加到checkbox.Name,其中UserID为checkbox.Name属性。

我还必须从writer.WriteLine(输出)更改为writer.Write(输出)。这删除了一个自动附加到文件的最终\ r \ n,后者又创建了无价值和无名复选框。

像魅力一样工作。再次感谢@γηράσκωδ'αείπολλάδιδασκόμεBreilliant。非常感谢您对此的耐心和帮助。当然,我指出了正确的方向。要求我真正去挖掘所有正在发生的事情。

祝你有个美好的一天! :-D

答案 1 :(得分: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];
...
...

修改

这有点令人尴尬,但解决方案更简单。我的意思是,只要按下按钮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);
}