【问题标题】:Passing String From datagridview to textbox in another form以另一种形式将字符串从datagridview传递到文本框
【发布时间】:2012-12-20 14:38:07
【问题描述】:

我设置了 2 个表单,其中一个加载了一个 datagridview,用户单击视图以选择他们想要的值。我可以在与 datagridview 相同的表单上的消息框中获取显示的值但是,当我尝试将其传递给另一个表单时,它显示为 NULL。我如何让它在文本框中显示。这是我的代码。当我调试代码时,它首先正确地传递值,但是当它完成运行时,它显示为空值。我已经尝试了许多不同的方法来尝试在不同的类上使用公共变量来做到这一点。

与文本框合一

 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;         
    }

带有dataGridView的Form2

       // 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;
        }
    }

【问题讨论】:

  • 我的猜测是您可能希望使用 ListOfSuppliers 类的现有实例,而不是创建新实例。
  • 最好的方法是通过使用某种消息传递实现来解耦功能,然后使用发布者/订阅者模型。
  • 你把FillTextBoxes函数放在代码的什么地方?
  • @Fabio 它在我希望传递变量的表单上。
  • 好的,但是在 Form_Load 内部还是在构造函数中?

标签: c# winforms


【解决方案1】:

我不确定我们是否在考虑同一件事,但请检查一下。 你有 Form1 哪里是 DataGridView 和 Form2 你的 TextBox 在哪里。

那么让我们在 Form1 中创建 Form2...

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,因此请将此声明包含在 Form2 中

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 中选择值,并在 Form2 上的 TextBox 中获取这个值,但正如我所说,我不确定我们是否在考虑同样的事情......

【讨论】:

  • 感谢您的回复,只是有点困惑,看到他创建了一个公共事件,我需要在 form1 上使用带有数据网格的表单吗?
  • Form1 = 带有 dataGrid 的表单,Form2 = 带有 TextBox 的表单,您正在 form2 上创建公共事件。在 Form1 上,您只需初始化 form2,将用户选择传递给它并显示它。其他所有内容(属性、事件)都在 form2 上。
  • 感谢您迟到的回复。当我运行时,我得到一个超出范围的错误。无论我点击哪个单元格,e.ColumnIndex 的值都是 -1。认为这是错误的原因,知道这是为什么吗?
【解决方案2】:

如果您在 Form2 中只需要字符串 SupplierID 然后在Form2中创建一个supplierID变量

private String supplierID;

独立于这些数据的目的为这个变量创建一个属性

然后为 Form2 创建一个新的自定义构造函数

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

在 Form1 中创建 Form2 的实例时,只需使用自定义构造函数

//somwhere in Form1
Form2 frm2 = New Form2(SelectedSupllierID)
frm2.ShowDialog() //…

【讨论】:

    【解决方案3】:

    此代码中的以下行是您的问题。

    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。你为什么用空值更新供应商ID。当您创建 ListOfSuppliers 的新对象时,该类中的 SupplierCode 为空,您正在为您的 SupplierID 分配一个空值。

    我也看不到变量_ListOfSuppliers的用途???

    【讨论】:

    • 当我测试它时,我传递了一个变量,看看我是否可以让它以这种方式工作,但我对此并不满意。
    【解决方案4】:

    由于某种原因,您无法通过创建表单New Instance 来传递string

    试试这个.. 在你的Form1 尝试通过这个代码显示 Form2。

     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;         
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      相关资源
      最近更新 更多