C#更改DataGridViewCell值不起作用

时间:2017-01-31 19:49:33

标签: c# datagridview

我有两种形式(Form1,Form2)。 Form1显示对象的值。 Form2允许用户修改Form1中值的某些属性。

旁注:(在Form1中,我以编程方式创建标签页,每个标签页中都有一个DataGridView)

我正在尝试将Form2中的新字符串值从Form1传输到DataGridView(我只能通过名称获取)。

我在Form1中创建了一个公共Tab控件,我可以访问它并搜索DataGridView。

我的代码不会产生任何错误,但DataGridView中的单元格不会像预期的那样发生变化。

我做错了什么?

//Form1
//Create public access to the TabControl on Form1
public TabControl xTabControl
{
   get
   {
       return tabControl1;
   }
}



//Form2
private void btnSubmit_Click(object sender, EventArgs e) 
{
   string newText = txtDescription.Text.ToString(); //New Text 
   string tabName = txtTabName.Text.ToString();   //Name of the Tab to reference

   int txtChanged = Int32.Parse(txtChanged.Text.ToString());  //0 = No Change, 1 = Change
   int jobID = Int32.Parse(hidJobID.Text.ToString());  //Job ID 
   int rowIndex = Int32.Parse(hidRowIndex.Text.ToString());  //The row we must reference in our DataGridView

   //Call the public method from Form1 to define the Tab Control
   TabControl tabControl = Form1.xTabControl;

   //Define the Tab Page
   TabPage tbpage = new TabPage();
   tbpage = tabControl.TabPages[tabName];

   //If there is a Tab Page with that name then revise the cell
   if (tbpage != null)
   {
       //Define a DataGridView object
       DataGridView dgv = new DataGridView();

       //Find the DataGridView inside the TabPage (there is only 1 per Tab Page)
       foreach (Control ctrl in tbpage.Controls)
       {
           dgv = (ctrl is DataGridView) ? (DataGridView)ctrl : dgv;
       }

       dgv.ReadOnly = false;

        DataGridViewCell cellDescription = dgv.Rows[rowIndex].Cells[6];
        DataGridViewCell cellCatName = dgv.Rows[rowIndex].Cells[7];
        DataGridViewCell cellCat = dgv.Rows[rowIndex].Cells[8];

        if (txtChanged > 0)
        {
            MessageBox.Show(cellDescription.Value.ToString());  //<-- This returns the correct string on the DataGridView
            dgv.CurrentCell = cellDescription;
            cellDescription.ReadOnly = false;
            cellDescription.Value = newText;  //<-- This should update the Cell, but it isnt!
        } 
        else 
        {

        }
    }
}  

1 个答案:

答案 0 :(得分:1)

我不确定您当前代码无法正常工作的原因。编译器应该抱怨的第一个问题是以下行:

int txtChanged = Int32.Parse(txtChanged.Text.ToString());  //0 = No Change, 1 = Change

显然变量txtChanged不能是stringint。我假设最初txtChangedTextBoxForm2的名称,其中用户键入0表示无更改,1表示更改。我只是将int txtChanged重命名为changeValue,并将if语句中的此变量更改为if (changeValue > 0).

最后,我不确定您是否能够像现在一样引用父窗体选项卡控件。我将公共属性设置为获取已发布的表单选项卡控件,但它没有正确返回选项卡控件。我再次得到编译时错误,表明Form1不包含xTabControl的定义。

为了简化操作,不要让Tab控件成为公共变量并从Form2访问此公共变量,只需将TabControl传递给Form2这将允许双向访问,要么从父选项卡控件中读取,要么写入它。

在这些更改后,您的代码似乎按预期工作。我假设名为TextBox的{​​{1}}中的文字设置为第{6}行的父{4}}。

txtDescription中,我们想制作一个全局DataGridView变量,指向rowIndex传递Form2。然后在TabControl的构造函数中为其签名添加Form1参数,以允许父级将其TabControl传递给Form2。如下所示:

TabControl

希望这有帮助。