【发布时间】:2018-02-10 11:46:39
【问题描述】:
在网上搜索了两天后,没有找到我能正确理解的解决方案,我不得不在这里寻求答案。
我有一个用 vb.net 编写的 Windows 窗体应用程序,并且工作正常。我决定用 c# 重写它,我认为这不会有太大的问题,但是......
我在项目中有两个类:
FormJobs 和 AppJobs
FormJobs 包含以某种方式修改表单的方法和函数。
AppJobs 包含其他一切的方法和函数(检查、扫描等)。
在我的主窗体 (FrmStart) 上,On_load 事件使用 AppJobs 中的函数来检查网络是否已启动 (public bool CheckNetConnection),然后检查以确保根保存文件夹存在 (public void CheckRoot)。
如果 CheckNetConnection 为 false 或 CheckRoot 不存在,则 FormJobs 类中的方法将一些按钮设置为禁用,一些标签用于显示错误信息,并设置表单的高度。
以上方法在 VB.net 中有效,但我在 C# 代码中不断收到 StackOverflowException 或 NullReferenceException。
我知道异常的原因是因为这两个类和表单都一直互相调用,所以我知道我需要删除这段代码,但我不确定如何让每个类和表单相互访问。这显然是糟糕的设计,因为我刚刚开始学习 C#,所以对此的任何帮助将不胜感激。
但我的主要问题是:-如何获得访问多个类的表单? 允许类相互访问? 让类对表单进行更改?
FrmStart 代码
AppJobs Appjobs = new AppJobs();
private void FrmStart_Load(object sender, EventArgs e)
{
KeyPreview = true;
if (Appjobs.CheckNetConnection(this) == true)
{
Appjobs.CheckRoot(this);
}
AppJobs 代码
public class AppJobs
{
FormJobs Formjobs = new FormJobs();
public string AppRoot = Properties.Settings.Default.DefaultFolder;
public string DefaultDevice = Properties.Settings.Default.DefaultScanner;
public bool NoDirectory = false;
DialogResult MsgBoxQuestion;
public bool CheckNetConnection(Form StartForm)
{
IPHostEntry ServerIP = new IPHostEntry();
bool ConnectedToServer = false;
string CurrentRoot = "MyServer";
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
try
{
IPHostEntry DNSTest = Dns.GetHostEntry(CurrentRoot);
if (DNSTest.AddressList.Length > 0)
{
ConnectedToServer = true;
}
else
{
ConnectedToServer = false;
}
}
catch (System.Net.Sockets.SocketException ex)
{
ConnectedToServer = false;
}
}
return ConnectedToServer;
}
public void CheckRoot(Form StartForm)
{
if (string.IsNullOrEmpty(AppRoot))
{
Formjobs.SetHeight(StartForm);
return;
}else if(AppRoot == "0")
{
Formjobs.SetHeight(StartForm);
return;
}
else
{
if ((!Directory.Exists(AppRoot)))
{
NoDirectory = true;
MsgBoxQuestion = MessageBox.Show(AppRoot + " is set, but the directory does not exist." + Environment.NewLine
+ Environment.NewLine + "Would you like to create the folder now?", "Root folder missing", MessageBoxButtons.YesNo);
if (MsgBoxQuestion == DialogResult.Yes)
{
Directory.CreateDirectory(AppRoot);
NoDirectory = false;
}
else
{
MessageBox.Show("You will not be able to use this program until you create a root folder.", "No root folder selected",MessageBoxButtons.OK);
}
}
}
}
}
FormJobs 代码
public class FormJobs
{
AppJobs Appjobs = new AppJobs();
public void SetHeight(Form StartForm)
{
if (Appjobs.AppRoot == null | Appjobs.AppRoot == "0") {
if (Appjobs.DefaultDevice == null | Appjobs.DefaultDevice == "0") {
if (StartForm.Controls["MenuStrip1"].Visible == true) {
StartForm.Height = 167;
StartForm.Controls["LblNoRoot"].Visible = true;
StartForm.Controls["LblNoRoot"].Location = new Point(0, 24);
StartForm.Controls["LblNoRoot"].Text = "There is no root folder selected. Please select a root folder to continue.";
StartForm.Controls["LblNoDevice"].Visible = true;
StartForm.Controls["LblNoDevice"].Location = new Point(0, 48);
StartForm.Controls["LblNoDevice"].Text = "There is no default device selected. Please select a default device to continue.";
StartForm.Controls["BtnOkTickets"].Enabled = false;
StartForm.Controls["BtnQueryTickets"].Enabled = false;
StartForm.Controls["BtnSearch"].Enabled = false;
}else
{
StartForm.Height = 147;
StartForm.Controls["LblNoRoot"].Visible = true;
StartForm.Controls["LblNoRoot"].Location = new Point(0, 9);
StartForm.Controls["LblNoRoot"].Text = "There is no root folder selected. Please select a root folder to continue.";
StartForm.Controls["LblNoDevice"].Visible = true;
StartForm.Controls["LblNoDevice"].Location = new Point(0, 33);
StartForm.Controls["LblNoDevice"].Text = "There is no default device selected. Please select a default device to continue.";
StartForm.Controls["BtnOkTickets"].Enabled = false;
StartForm.Controls["BtnQueryTickets"].Enabled = false;
StartForm.Controls["BtnSearch"].Enabled = false;
}
}
【问题讨论】:
-
请与我们分享您不工作的 c# 代码。我非常确定错误出在您的实现中,而不是您在此处为我们描述的逻辑中。
-
不看代码就无法修复代码。至于总体布局,我不会让
FormJobs更改 表单,而是公开一个状态(例如bool DisableAllButtons),并拥有每个表单(在创建时,或在接收到状态改变)观察暴露的状态并相应地调整自身。随意更改类彼此是几乎无法维护的代码的温床。让类/表单根据其环境自行更改更易于管理。 -
向问题添加代码
-
好吧仍然是一个小的方法来回答一个可回答的问题...哪些异常位于哪里?现在我们可以看到您的代码,您可以删除上面的大部分纯文本
标签: c# winforms visual-studio