我有一个带有按钮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
答案 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);
}