C# c“生成一个可变值”&引用;单击按钮,但仅指向对话框
我有一个无模式用户界面,它将用户ID添加到允许或删除对程序部分访问的列表中。当我点击“修改”按钮时,一切正常。假设我关闭对话框并实现“等等,忘记做X”。当我重新打开对话框,执行我的工作并单击“修改”时,即使文本框为空,用于添加用户ID的值仍可用于程序 它发生在下面代码的某个地方C# c“生成一个可变值”&引用;单击按钮,但仅指向对话框,c#,.net,permissions,C#,.net,Permissions,我有一个无模式用户界面,它将用户ID添加到允许或删除对程序部分访问的列表中。当我点击“修改”按钮时,一切正常。假设我关闭对话框并实现“等等,忘记做X”。当我重新打开对话框,执行我的工作并单击“修改”时,即使文本框为空,用于添加用户ID的值仍可用于程序 它发生在下面代码的某个地方 public static void checkSame() { int count = 0; bool test = false; while (linesPerm.Length >=
public static void checkSame()
{
int count = 0;
bool test = false;
while (linesPerm.Length >= count && tbPermValue != "")
{
if (linesPerm.Length >= count)
{
test = linesPerm.Contains(tbPermValue);
count += (linesPerm.Length + 1);
if (test == true)
{
DialogResult dr = MessageBox.Show("The UserID " + tbPermValue +
" already exists in the Permissions column. "
+ Environment.NewLine + "Would you like to add the UserID" +
tbPermValue + " to the Permissions column anyway?",
"User Already Exists", MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
switch (dr)
{
case DialogResult.Yes:
break;
case DialogResult.No:
tbPermValue = "";
break;
}
}
}
else
{
MessageBox.Show("Do Nothing");
}
}
}
如果用户在对话框中选择“否”,则程序无法使用tbPermValue
的值。如果用户选择“是”,则即使对话框关闭并重新打开,tbPermValue
的值也会持续存在。我试图像这样清除文本框值
tbUserName.Text = "";
tbUserName.Clear();
还有其他几种方式<代码>tbUserName值将从文本框中清除,但不会从上面的代码中清除。我得到了tbPermValue
的值,如下所示
public static void addPerm(System.Windows.Forms.Form targetForm)
{
foreach (Control C in targetForm.Controls)
{
if (C.GetType() == typeof(TextBox))
{
if (C.Text != "")
{
tbPermValue = C.Text;
}
}
}
}
这是一个由其父对象拥有的非模态对话框
是否有人能告诉我一个方向,在单击按钮后,将删除对第一个代码框的DialogResult部分的访问权限。我不能完全丢失它,因为tbPermValue
用于后续的其他代码中
编辑:好的。我刚刚测试了这个,值保存在内存中。我有一个对话框Form1,它有一个按钮,可以在那里打开dialog Star。在Star上有一个打开权限的按钮。StartHere拥有权限,因此当我关闭StartHere时,权限和StartHere的所有其他子表单都将关闭。这些都是非模态对话框。我的变量tbPermValue被保存在内存中,返回到Form1。当我关闭对话框时,该值未被释放。我将按照下面Eric的建议回去研究垃圾收集。谢谢你,埃里克。一旦我找到了这个过程的规则,我会删除这个问题,或者至少发布一个新的更好的问题。多谢各位
编辑2:这是您要求的代码γηρρσκωδ′αεπλλλλδδασκμε
private void bModify_Click(object sender, EventArgs e)
{
WidgetLogic.addPerm(this);
WidgetLogic.checkSame();
WidgetLogic.writePerm(this);
WidgetLogic.writeAdmin(this);
WidgetLogic.writeDetailer(this);
tbUserName.Clear();
}
如上所述,我尝试了多种方法来清除
tbUserName
,但均无效。我看到您说您已尝试在switch语句的“是”部分设置以下内容:
tbUserName.Text = "";
tbUserName.Clear();
但是在“否”部分,您没有设置tbUserName
,而是设置变量tbPermValue
。据我所知,你也应该
tbPermValue = "";
在“是”部分,您也可以清除该变量,甚至可以在对话框关闭之前将其移出开关并让其这样做,因为您将在所有可能的开关情况下进行设置。不要使用
tbPermValue
,而是直接使用文本框
:
while (linesPerm.Length >= count && tbUserName.Text != "")
编辑
将addPerm
中的代码更改为此,您就完成了:):
你不需要
checkSame()
中的开关(dr)
,我已经读了好几遍了,仍然不知道你在问什么?我没有投反对票,也永远不会投反对票。但老实说,您的代码似乎真的不清楚。有没有想过使用绑定和MVVM。这并不简单,但相信我,它可以解决很多问题,而且在最后,它更容易维护。@EricOuellet我不介意投反对票。我认为如果他们留下评论会很有帮助,就像你那样。两条评论说有些事情不清楚。我的要求和更干净的代码。这至少告诉了我一些事情。如果它得到1000张反对票,我会大发雷霆。但是如果我得到1000条评论,我可以看到其他人看到的:-D,这反过来可能会帮助我在未来提出不同的问题。好的,说清楚。您有一个文本框条目。当有人输入一个值并按下“回车”键时(例如),该值将根据(something?
)进行检查。如果存在,则会出现一个消息框,询问('这是重复的。是否继续?'),如果他们说是(doSomething
)。如果他们说不(doSomethingElse
)。你能澄清一下你想要什么吗?我作为代码放置的位是用来做什么的,如果以后还有其他位要做吗?如果值仍然存在,那是因为它从来没有被GC过,而你正在使用同一个对话框。您也可以清除Oninitialize或OnLoad事件中的值,但如果需要,这是因为您在某个地方遇到了更深层次的问题。谢谢您的帮助<代码>tbUserName可在对话框权限中找到,而tbPermValue
则从targetForm
权限中分配值tbUserName
。我清除表单权限上按钮单击方法内部的tbUserName
。哦,我想你应该使用一个标志,但是如果按照jbutler483建议的以前的值进行测试,我会使用DialogResult属性。然后,在最内层if中的addPerm方法中,您可以针对c.Text!=“”和DialogResult==true,如果用户单击yes时DialogResult为true,则您知道忽略tbPermValue=C.Text。当然,正如Eric Ouellet现在向你(和我!)表明的那样,这里真正的问题是垃圾收集。我不确定你所说的旗帜是什么意思?我也不明白为什么在MessageBox上选择No会清除内存中保存的值?在你发表评论后,我进一步解释了使用标志,希望它能更好地回答这个问题。至于为什么选择“不工作”…我也不明白,尽管我猜这与tbPermValue=“””一行有关;我没有访问tbUserName
的权限。它从UI传递到我的逻辑文件。谢谢你的评论。水力压裂技术太棒了!!:-我要去真正的工作了。我一定会通过这一步,看看你是如何修复它的。我的英雄!!:-D非常感谢你!!好啊我看到了。当我添加tbUserName.Clear()时代码>权限我通过清除字段做了正确的事情
public static void addPerm(System.Windows.Forms.Form targetForm)
{
foreach (Control C in targetForm.Controls)
{
if (C.GetType() == typeof(TextBox))
{
tbPermValue = C.Text;
}
}
}