2010-12-16 9 views
4

양식 사이에 값을 전달하려고합니다.이 경우 DataGridView에서 강조 표시된 셀의 결과입니다. 내 기본 폼에서메서드에서 반환 된 값을 public string으로 설정합니다.

, 나는 공공 문자열 방법을 사용하여 값을 얻을 :

public string GetCaseID() 
    { 
     int i; 
     i = dgCases.SelectedCells[0].RowIndex; 
     string caseid = dgCases.Rows[i].Cells[1].Value.ToString(); 
     string version = dgCases.Rows[i].Cells[2].Value.ToString(); 
     return version + "_c" + caseid; 
    } 

    //Form2 is launched 
    private void btnEvLvlUserSelect_Click(object sender, EventArgs e) 
    { 
     Form2 form2= new Form2(); 
     form2.ShowDialog(); 
    } 

GetCaseID 이후()를 공공 문자열로, 내가 바로, 내 Form2를에서 호출 할 수 있어야 선언?

Form2를, 난 그냥이 있습니다

private void button1_Click(object sender, EventArgs e) 
    { 
     //Take selected case information 
     fmHome fmhome = new fmHome(); 
     textBox1.Text = fmhome.GetCaseID(); 
    } 

나는 십자가 형태의 통신이 작동 알고 : 나는 평범한 구식 문자열() GetCaseID를 교체 할 경우, Form2를 예상하고 표시합니다.

dgCases를 공용으로 선언해야하는 것과 관련이있을 수 있습니까?

감사합니다.

+0

정상적으로 작동합니다. 위의 코드를 사용하면 어떻게됩니까? – TToni

답변

4

button1_Click에서 fmHome 클래스의 새 인스턴스를 만듭니다. 이 인스턴스는 인스턴스를 만든 인스턴스 fmHome이므로 dgCases에 선택된 행이 없습니다. 이 인스턴스에서 GetCaseID()을 호출해도 예상 한 결과가 반환되지 않습니다.

button1_Click 핸들러에는 GetCaseID()을 열어 본 양식에서 전화 할 방법이 있어야합니다. 아주 기본적인 방법은 Form2에 이런 속성을 추가하는 것입니다 : 다음

public fmHome fmHomeParent { get; set; } 

, 당신은 Form2의 인스턴스를 열 때, 이렇게 : 그래서

private void btnEvLvlUserSelect_Click(object sender, EventArgs e) 
{ 
    Form2 form2= new Form2(); 
    form2.fmHomeParent = this; 
    form2.ShowDialog(); 
} 

당신의 button1_Click 핸들러에서, 당신이 할 수있는 새로운 인스턴스를 만드는 대신 해당 인스턴스에 액세스하십시오.

희망이 있습니다.

+0

도넛 - 당신은 항상 처음으로 대답하고 환상적으로 명확한 설명을 제공합니다. 그게 완벽하게 작동했습니다. 모든 도움을 주셔서 다시 한번 감사드립니다! –

+0

@David M 문제 없습니다. 기꺼이 도와 드리겠습니다. – Donut

1

fmHome의 새 인스턴스를 button1_Click에 만들면 원래 데이터 격자가 포함되지 않습니다.

DataGrid의 인스턴스를 매개 변수로 Form2 생성자에 전달할 수 있습니다.

참고 :보기와 데이터를 혼합하는 방식은 유지 보수가 불가능한 코드로 이어지고 좋은 습관은 아닙니다 ...하지만 기존 코드를 다루고 있다고 가정합니까?

+0

프로그래밍하는 방법을 배우고 현재 모든 초보자 실수를 저지르고 있습니다. 보기와 데이터를 섞어서 무엇을 의미하는지 자세히 설명해 주시겠습니까? –

+0

모델과 뷰를 분리 - WPF를 사용하는 경우 MVVM 패턴을 살펴보십시오. 또는 ASP.NET을 사용하는 경우 MVC 패턴을 찾습니다. 그냥 구글, 그것에 대해 많은 정보를 찾을 수 있습니다 :) –

0

새로운 인스턴스를 만드는 것은 의미있는 가치를 얻지 못할 것입니다.

대신 Form2이 원래 fmHome 인스턴스에 대한 참조를 가져올 수 있는지 확인하십시오. 가장 일반적인 패턴은 fmHome 유형의 (Form2) 멤버 변수를 추가하고 작성자가이를 전달해야하는 Form2 생성자의 일부로 설정하는 것입니다 (귀하의 경우 btnEvLvlUserSelect_Click). 그런 다음 (보이지 않는) 빈 폼을 만드는 대신 Form2.button1_Click() 메서드를 사용하십시오.

0

당신도 할 수있는 것은 다음 Form2의에서 다음

//Form2 is launched 
private void btnEvLvlUserSelect_Click(object sender, EventArgs e) 
{ 
    Form2 form2= new Form2(this.GetCaseID()); 
    form2.ShowDialog(); 
} 

:

public partial class PlayerInfo : Form 
{ 
    string caseID; 
    public Form2(string fmHomeCaseID) 
    { 
     caseID = fmHOmeCaseID; 
    } 


    // Button Click in your second form 
    private void button1_Click(object sender, EventArgs e) 
    { 
     textBox1.Text = caseID; 
    } 
} 

당신도 할가에 필요한 모든 정보를 보유하는 클래스를 만들 것입니다 수 있습니다 응용 프로그램을 작성한 다음 필요에 따라 채우고 두 양식을 모두 연결하지 않고 다른 양식에서 데이터를 가져옵니다. 그러나 이것이 최선의 해결책인지 나는 모른다.

관련 문제