Windows Form이 이미 있는지 확인하고 열려있는 경우 닫는 방법은 무엇입니까?
10 분마다 열리는 간단한 정보 창 ( ) 인 "fm" 양식 이 fm.Show();
있습니다.
10 분마다 "fm" 양식 이 열려 있는지 확인 하고 있으면 괜찮습니다!
이제 양식 fm은 항상 생성 form fm = new form();
양식이 열려 있는지 확인할 때 이전에 양식이 하나 있어도 항상 거짓이고 새 창을 다!
고유 한 신원을 부여 할 수있는 도구가 필요하며 고유 한 신원을 가진 양식이 열렸는지 확인해야합니다!
버튼이있는 복잡한 정보가 있기 때문에 양식 (fm)의 데이터 만 업데이트하고 싶지 않습니다.
양식 이름은 "UpdateWindow"
감사합니다
아마도 이것이 도움이 될 것입니다.
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
//iterate through
if (frm.Name == "YourFormName")
{
bFormNameOpen = true;
}
}
foreach의 일부 코드는 특정 형식을 감지하고 수행 할 수 있습니다. 그래도 테스트되지 않을 것입니다.
에서 박물관 수 http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms
늦었다는 건 알지만 ... 궁금하신 분들을 위해 ...
if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1)
Application.OpenForms.OfType<UpdateWindow>().First().Close();
UpdateWindow frm = new UpdateWindow()
frm.Show();
메뉴에서 양식을 호출하고 MDI 양식을 클릭 가정하면 다음과 같이 최상위 수준에서 해당 양식의 인스턴스를 선언합니다.
Form1 fm = null;
그런 다음 다음과 같이 Form1을 호출하는 메뉴 클릭 이벤트를 정의합니다.
private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (fm == null|| fm.Text=="")
{
fm = new Form1();
fm.MdiParent = this;
fm.Dock = DockStyle.Fill;
fm.Show();
}
else if (CheckOpened(fm.Text))
{
fm.WindowState = FormWindowState.Normal;
fm.Dock = DockStyle.Fill;
fm.Show();
fm.Focus();
}
}
CheckOpened는 Form1에 이미 열거 나하지되어 있는지 확인하기 위해 정의 :
private bool CheckOpened(string name)
{
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
if (frm.Text == name)
{
return true;
}
}
return false;
}
이것이 이미 열려 있거나 최소화 된 경우 메뉴 클릭시 Form1에 늘어나는 맞추는 양식의 여러 인스턴스를 해결되기 때문에 바랍니다.
나는 그 이해를 잘 모르겠습니다. 도움이 되셨기를 바랍니다. 이 폼의 인스턴스를 하나만 사용하는 사용자 정의 닫기 Form.Dispose 호출을 방지해야합니다 . 이를 위해 시나리오 폼의 Closing 이벤트를 처리 할 수 있습니다.
private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
this.Hide();
e.Cancel = true;
}
그런 다음 새 인스턴스를 만들 필요가 없습니다 frm
. 인스턴스에서 Show 메서드를 호출하기 만하면됩니다.
Form.Visible 속성을 확인하여 현재 양식이 열려있는 속성을 확인할 수 있습니다.
private ChildForm form = new ChildForm();
private void ReopenChildForm()
{
if(form.Visible)
{
form.Hide();
}
//Update form information
form.Show();
}
사실, 양식의 데이터를 업데이트하지 않는 이유는 여전히 이해하지 못합니다.
Form fc = Application.OpenForms["UpdateWindow"];
if (fc != null)
fc.Close();
fc.Show();
Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null;
if (fc != null)
{
fc.Close();
}
다음을 사용하여 원하는 경우 양식을 다시 열 수 있습니다.
Form1 frm = New Form1();
frm.show();
if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
//form is visible
else
//form is invisible
Form1
양식의 이름은 어디에 있습니까?
시도하면 작동합니다.
//inside main class
Form1 Fm1 = new Form1();<br>
//in button click
if (Fm1.IsDisposed)
{
Fm1 = new Form();
}
Fm1.Show();
Fm1.BringToFront();
Fm1.Activate();
이 MDICHILD 기능 현관을 사용해보십시오
public void mdiChild(Form mdiParent, Form mdiChild)
{
foreach (Form frm in mdiParent.MdiChildren)
{
// check if name equals
if (frm.Name == mdiChild.Name)
{
//close if found
frm.Close();
return;
}
}
mdiChild.MdiParent = mdiParent;
mdiChild.Show();
mdiChild.BringToFront();
}
아래에 연결 시도.
private void frmMyForm_Deactivate(object sender, EventArgs e)
{
// Raise your flag here.
}
이벤트 위의 연결을 통해 양식이 최소화 될 때마다 다른 양식에 의해 부분적으로 / 완전히 숨겨 질 때마다 알려줍니다.
이것은 내가 모든 열린 양식을 닫는 것입니다 (기본 양식 제외)
private void CloseOpenForms()
{
// Close all open forms - except for the main form. (This is usually OpenForms[0].
// Closing a form decrmements the OpenForms count
while (Application.OpenForms.Count > 1)
{
Application.OpenForms[Application.OpenForms.Count-1].Close();
}
}
재미 있네요.이 추가해야합니다.
1) form.show ()에 전역 변수를 추가하고 form.close ()에서 변수를 지합니다.
2) 부모 양식에 타이머를 추가하십시오. 자녀 양식을 열어두고 10 분마다 데이터를 업데이트하십시오.
3) 마이너스 폼에 타이머를 넣어 데이터를 업데이트합니다.
* 희망이 당신을 위해 작동합니다
System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"];
if(((Order)f1)!=null)
{
//open Form
}
else
{
//not open
}
이 시도
bool IsOpen = false;
foreach (Form f in Application.OpenForms)
{
if (f.Text == "Form2")
{
IsOpen = true;
f.Focus();
break;
}
}
if (IsOpen == false)
{
Form2 f2 = new Form2();
f2.MdiParent = this;
f2.Show();
}
private static Form IsFormAlreadyOpen(Type formType)
{
return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
}
한 번만 형성
양식의 여러 삽입을 허용하는 것이 목표 인 경우 다음을 고려하십시오.
public class MyForm : Form
{
private static MyForm alreadyOpened = null;
public MyForm()
{
// If the form already exists, and has not been closed
if (alreadyOpened != null && !alreadyOpened.IsDisposed)
{
alreadyOpened.Focus(); // Bring the old one to top
Shown += (s, e) => this.Close(); // and destroy the new one.
return;
}
// Otherwise store this one as reference
alreadyOpened = this;
// Initialization
InitializeComponent();
}
}
Form user_rpt = Application.OpenForms["frmUesr_reports"];
if (user_rpt == null)
{
/// Do Something here
}
시도 시도가 양식이 있는지 여부를 확인하는 간단한 아이디어입니다.
내 앱에는 여러 다른 양식 (하위 양식)으로 이동하는 버튼이있는 메인 메뉴 양식이 있습니다. 한 번에 각 하위 양식의 인스턴스 하나만 실행되기를 원했습니다. 또한 사용자가 이미 존재하는 하위 양식을 실행하려고 시도한 경우 하위 양식이되거나 다른 앱 창에있는 경우 "front & center"가 강제로 표시하고 싶었습니다. 현재 가장 많이 찬성 된 답변을 사용하여 답변을 다음과 같이 리팩토링했습니다.
private void btnOpenSubForm_Click(object sender, EventArgs e)
{
Form fsf = Application.OpenForms["formSubForm"];
if (fsf != null)
{
fsf.WindowState = FormWindowState.Normal;
fsf.Show();
fsf.TopMost = true;
}
else
{
Form formSubForm = new FormSubForm();
formSubForm.Show();
formSubForm.TopMost = true;
}
}
if (Application.OpenForms["Form_NAME"] == null)
{
new Form_NAME().Show();
}
양식 인스턴스가 열려 있지는 IF 루프에 들어갑니다.
이것은 나를 형성했습니다.
public void DetectOpenedForm()
{
FormCollection AllForms = Application.OpenForms;
Boolean FormOpen = false;
Form OpenedForm = new Form();
foreach (Form form in AllForms)
{
if (form.Name == "YourFormName")
{
OpenedForm = form;
FormOpen = true;
}
}
if (FormOpen == true)
{
OpenedForm.Close();
}
}
내 방법이 가장 간단 하다고 생각합니다 .
Form2 form2 = null;
private void SwitchFormShowClose_Click(object sender, EventArgs e)
{
if(form2 == null){
form2 = new Form2();
form2.Show();
}
else{
form2.Close();
form2 = null;
}
}
아래는 실제로 매우 잘 작동합니다.
private void networkInformationToolStripMenuItem_Click(object sender, EventArgs e)
{
var _open = false;
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
if (frm.Name == "FormBrowseNetworkInformation")
{
_open = true;
frm.Select();
break;
}
}
if (_open == false)
{
var formBrowseNetworkInformation = new FormBrowseNetworkInformation();
formBrowseNetworkInformation.Show();
}
}
확실히 확실히 말할 것입니다. 나도이 기능을 사용한다.
public static bool isFormOpen(Form formm)
{
foreach (Form OpenForm in Application.OpenForms)
{
if (OpenForm.Name == formm.Name)
{
return true;
}
}
return false;
}
내가 미국 이전 게시물을 수정했습니다. 이것은 모든 열린 양식을 반복 할 필요없이 완벽하게 작동합니다.
Form fc = Application.OpenForms["FormBrowse"];
if (fc != null)
{
fc.Select();
}
else
{
var formBrowse = new FormBrowse();
formBrowse.Show();
}
또한 이것은 도움이 될 수 있습니다.
class Helper
{
public void disableMultiWindow(Form MdiParent, string formName)
{
FormCollection fc = Application.OpenForms;
try
{
foreach (Form form in Application.OpenForms)
{
if (form.Name == formName)
{
form.BringToFront();
return;
}
}
Assembly thisAssembly = Assembly.GetExecutingAssembly();
Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == formName).First();
Form myProgram = (Form)Activator.CreateInstance(typeToCreate);
myProgram.MdiParent = MdiParent;
myProgram.Show();
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
}
'ProgramingTip' 카테고리의 다른 글
C #을 통해 웹 사이트에 로그인 (0) | 2020.10.26 |
---|---|
주어진 배경색에 수준 텍스트 전경색 (0) | 2020.10.26 |
단일 unix 명령에서 접두사를 사용하여 폴더의 모든 파일 이름 짓고 (0) | 2020.10.25 |
지시문에 양식 전달 (0) | 2020.10.25 |
오류 : 데이터 경로“.builders [ 'app-shell']”에는 필수 속성 'class'가 있어야합니다. (0) | 2020.10.25 |