Both of the answers given so far will work but I want to elaborate on the answers a little and provide an alternative. Let's say you create your own class like this:
public class YourClass
{
public int ProsesChemicalId1 { get; set; }
public int ProsesChemicalId2 { get; set; }
}
Then you can assign an instance of your class to the Tag property like this:
YourClass yourClass = new YourClass();
yourClass.ProsesChemicalId1 = this.proses_chemicalDataGridView1.Rows[e.RowIndex].Cells[1].Value;
yourClass.ProsesChemicalId2 = this.proses_chemicalDataGridView2.Rows[e.RowIndex].Cells[1].Value;
Form prosesEdit = new FormProsesChemicalRawWbEdit();
prosesEdit.Tag = yourClass;
prosesEdit.ShowDialog();
And you can get the instance of the class back out of the Tag property like this:
yourClass = (YourClass) this.Tag;
this.proses_chemicalTableAdapter.FillByChemId(this.mcd_softwareDataSet.proses_chemical, yourClass.ProsesChemicalId1);
However, it's generally bad practice to use the Tag property to pass values around in forms because it requires a lot of type casting and knowledge of what is stored in each tag.
A more robust way is to use constructor injection since you know the type of form you are creating:
int value1 = this.proses_chemicalDataGridView1.Rows[e.RowIndex].Cells[1].Value;
int value2 = this.proses_chemicalDataGridView2.Rows[e.RowIndex].Cells[1].Value;
Form prosesEdit = new FormProsesChemicalRawWbEdit(value1, value2);
prosesEdit.ShowDialog();
You would then most likely have to store those values as properties or fields inside the form. The reason this is a more robust approach is that it's resistant to accidental change. In other words, if you need to pass in a 3rd value in future it's less likely you'll forget to change code that needs changing.
You could also use property injection here but I'm not sure of your requirements so I'll leave it to you to decide.