2012-12-20 63 views
2

我已經設置了一個2表單載入一個datagridview,並且用戶單擊視圖以選擇他們想要的值。我可以在datagridview的同一窗體中獲得顯示在消息框內的值但是,當我嘗試將它傳遞給另一個窗體時,它顯示爲NULL。我將如何讓它顯示在文本框內。這是我的代碼。當我調試代碼時,它首先正確傳遞值,但是當它完成運行時,它顯示爲空值。我已經嘗試了很多不同的方法來做到這一點,試圖在不同的類上使用公共變量。將字符串從datagridview傳遞到另一種形式的文本框

與文本框

public void FillTextBoxes(object sender, EventArgs e, string SupplierID) 
    { 
     supplierVO _SupplierVo = new supplierVO(); 
     ListOfSuppliers _ListOfSuppliers = new ListOfSuppliers(); 
     SupplierID = _ListOfSuppliers.SupplierCode;         
     MessageBox.Show(SupplierID); 
     txtSupplierCode.Text = SupplierID;   
    } 

窗體2與DataGridView的

 // Links to the user double click of the datagrid 
    public void SelectGridInformation (object sender, EventArgs e) 
    { 
     ChangeSupplierInfo _ChangeSupplerInfo = new ChangeSupplierInfo(); 

     supplierVO _SupplierVO = new supplierVO(); 

     Int32 selectedRowCount = dataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected); 

     string SelectedSupplierID = dataGridView1.SelectedCells[0].Value.ToString(); 

     SupplierCode = SelectedSupplierID; 

     _SupplierVO.SupplierCode = SelectedSupplierID; 

     _ChangeSupplerInfo.FillTextBoxes(sender, e, SelectedSupplierID); 

     this.Close(); 
    } 

我一直在試圖用get和set屬性的在這裏做這一個表是該代碼示例。

public string SupplierCode 
    { 
     get 
     { 
      return _SupplierCode; 
     } 
     set 
     { 
      _SupplierCode = value; 
     } 
    } 
+1

我的猜測是,你想用你的'ListOfSuppliers'類的現有實例,而不是創建的例如。 – PhoenixReborn

+1

最好的方法是通過使用某種消息傳遞實現來分離功能,然後使用發佈者/訂戶模型。 –

+0

你在代碼中放置了'FillTextBoxes'函數? – Fabio

回答

2

我不知道,如果我們正在考慮同樣的事情,但看一下這個。 你已經有Form1 DataGridView和Form2哪裏是你的TextBox。

因此,讓我們創建窗體2內Form1中......

Form2 form2 = new Form2(); 
form2.show(); 

...並獲得DataGridView中的選定單元格

form2.value = getDataGridValue(); 

然後,讓我們財產申報中的Form2,這是我們會通過用戶選擇的值。

private string _value; 

public string value 
{ 
    get { return _value; } 
    set 
    { 
     _value = value; 
     OnPropertyChanged(_value); 
    } 
} 

請注意,我們使用INotifyPropertyChanged的所以包括內部窗體2

public partial class Form2 : Form, INotifyPropertyChanged 

本聲明創建公共事件

public event PropertyChangedEventHandler PropertyChanged; 

不管走到哪裏我們的用戶點擊DataGridView的東西提出來

protected void OnPropertyChanged(string value) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(value)); 
     } 
    } 

然後在Form2Load訂閱你的新事件

private void Form2_Load(object sender, EventArgs e) 
{ 
    PropertyChanged += new PropertyChangedEventHandler(Form2_PropertyChanged); 
} 

,做的東西

void Form2_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    this.InvokeIfRequired((value) => textBox1.Text = value, e.PropertyName); 
} 

對我來說它工作得很好,我選擇在Form1上的DataGridView價值和獲取裏面的TextBox這個值窗體2,但正如我所說,我不知道,如果我們正在考慮同樣的事情...

+0

感謝您的回覆只是有點困惑,看到他創建一個公共事件,我需要在form1與datagrid的形式嗎? – Inkey

+0

Form1 =帶有dataGrid的窗體,帶有TextBox的Form2 =窗體,您正在form2上創建公共事件。在Form1上,您只需初始化form2,將用戶選擇傳遞給它並顯示它。其他一切(屬性,事件)都在form2上。 – erem

+1

[https://dl.dropbox.com/u/96085825/suplier.zip] – erem

0

此代碼中的以下行是您的問題。

public void FillTextBoxes(object sender, EventArgs e, string SupplierID) 
{ 
    supplierVO _SupplierVo = new supplierVO(); 
    ListOfSuppliers _ListOfSuppliers = new ListOfSuppliers(); 
    SupplierID = _ListOfSuppliers.SupplierCode; //This line is the problem.         
    MessageBox.Show(SupplierID); 
    txtSupplierCode.Text = SupplierID;   
} 

您正在從方法的參數中獲取SupplierID。你爲什麼用空值更新供應商標識。當您創建一個ListOfSuppliers的新對象時,那麼該類中的SupplierCode是空的,您將爲您的SupplierID分配一個空值。

另外我看不到變量_ListOfSuppliers的目的?

+0

當我測試它傳遞了一個變量,看看我是否能以這種方式工作,但沒有它的喜悅。 – Inkey

0

不能由某些原因

創建表單New Instance通過string嘗試在Form1試圖通過這個代碼,以顯示窗體2這一個..。

using (var f = new Form2 
         { 
          Owner = this 
         }) f.ShowDialog(); 

然後在Form2事件時,它應該是這樣的

Form1 f0 = this.Owner as Form1; //_ChangeSupplerInfo 

    supplierVO _SupplierVO = new supplierVO(); 

    Int32 selectedRowCount = dataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected); 

    string SelectedSupplierID = dataGridView1.SelectedCells[0].Value.ToString(); 

    //SupplierCode = SelectedSupplierID; 

    //_SupplierVO.SupplierCode = SelectedSupplierID; 

    f0.FillTextBoxes(SelectedSupplierID); 

    this.Close(); 

Form1

public void FillTextBoxes(string SupplierID) 
    { 
     supplierVO _SupplierVo = new supplierVO(); 
     ListOfSuppliers _ListOfSuppliers = new ListOfSuppliers(); 
     //SupplierID = _ListOfSuppliers.SupplierCode;         
     MessageBox.Show(SupplierID); 
     txtSupplierCode.Text = SupplierID;   
    } 
1

,如果你需要在你的窗體2 唯一字符串供應商ID,然後在窗體2

創建供應商ID的變量
private String supplierID; 

independ這個數據的目的,此變量

創建屬性然後創建一個新的自定義構造函數的Form2

public void Form2(String supplierid) 
{ 
    this.supplierID = supplierid; 
} 
在Form1中

當你創建實例的窗體2只使用您的自定義構造函數

//somwhere in Form1 
Form2 frm2 = New Form2(SelectedSupllierID) 
frm2.ShowDialog() //… 
相關問題