我有Form1,它有一个dataGridView和一个向该Grid添加内容的按钮。选择此按钮时,我调用Form2,它有2个TextBox和一个ComboBox来填充名称,目录和格式(例如),再加上一个OK按钮,将行添加到Form1上的dataGridView。
当我返回Form1时,dataGridView必须显示输入的内容。会发生什么是我的网格有三列:名称,格式和按钮列,当点击它时,重新加载Form2的屏幕,并在每个字段中再次加载先前填充的信息,以便能够更改或只是咨询。
首先,我尝试创建一个函数,通过参数将行添加到Grid中,如下面的代码所示:
Eu tenho o Form1 que possui uma dataGridView eummotãopraadicionarconteúdosnessaGrid。 Ao selecionaressebotão,eu chamo o Form2 que possui 2 TextBox e um ComboBox para preencher o Nome,DiretórioeFormato(por exemplo),alémdeumobotãoOKpara adicionar a linha a dataGridView na Form1。
表格1
public Form1()
{
InitializeComponent();
}
public void AddRows(string name, string path)
{
dataGridView1.Rows.Add(name, path);
dataGridView1.Update();
}
表格2
public Form2()
{
InitializeComponent();
}
private void bt1_Click(object sender, EventArgs e)
{
var nome = txt_name.Text;
var path = txt_path.Text;
var form1 = new Form1();
form1.AddRows(name, path);
}
然而,它最终无法正常工作,在网格上没有显示任何内容。所以我想创建一个带有名称,路径和格式方法的类(为每个方法获取和设置)将所有内容存储在一个对象列表中(我认为就是这样,如果我错了,请原谅我因为我是初学者) 。或者保存到DataSet。但后来我想,我在Form2中实例化了类并传递了字段中填充的值,但是,我在Form1中该怎么办?
我认为这一切都非常混乱,如果有人能够解释一种更清晰的方法来解决这种情况,我会很感激,因为我是初学者,所以请非常具体。
答案 0 :(得分:0)
你能试试我的演示吗?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnEdit_Click(object sender, EventArgs e)
{
//change code to get current row and check null, etc
var sels = dataGridView1.SelectedRows;
if (sels == null || sels.Count == 0)
return;
DataGridViewRow selRow = sels[0];
frmDialog dlg = new frmDialog(
selRow.Cells[0].Value,
selRow.Cells[1].Value);
if (dlg.ShowDialog() == DialogResult.OK)
{
selRow.Cells[0].Value = dlg.Col1Value;
selRow.Cells[1].Value = dlg.Col2Value;
//...
}
}
}
public partial class frmDialog : Form
{
public object Col1Value;
public object Col2Value;
//...other properties
public frmDialog()
{
InitializeComponent();
}
public frmDialog(object col1, object col2)
{
InitializeComponent();
this.Col1Value = col1;
this.Col2Value = col2;
//...other properties
}
private void btnOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
}
答案 1 :(得分:0)
目前还不清楚你想要实现的目标。看来你有两种形式。在表单(form1)上有一个DataGridView
和一个Button
来向网格添加新行。在第二个窗体(form2)上有两个文本框和一个组合框和一个“确定”按钮。我猜测文本框用于允许用户输入新的“名称”和“格式”数据。然后,当用户单击“确定”按钮时,文本框中的数据将添加到form1中DataGridView
的新行。最后,DataGridView
每行的“编辑”按钮允许用户打开SAME form2(用于添加新项目)并使用它来编辑用户单击的行。
我希望我能正确理解这一点。这是可行的,有很多方法可以实现这一目标。我只能假设有一些原因你不会直接在网格中“添加”或“编辑”这些单元格。 DataGridView
“添加新行”或“编辑单元格”的默认行为已经实现,如果没有新的form2并且绝对没有代码可以实现相同的功能,则不需要form2来执行此操作需要。因此,我将假设您无法直接在网格中编辑单元格。拥有DataSource
可能是一个原因(见下文)......
以下答案是实现这一目标的一种方法。如果DataSource
DataGridView
,我必须发出警告。但是,您可以使用此方法,只要下面的代码添加或编辑网格中的单元格,它就会通过直接访问网格单元格来实现。如果网格附加DataSource
,则无效。如果有DataSource
,那么当下面的代码添加或修改项目时,您需要更改代码以对DataSource
执行这些添加/编辑操作,而不是网格本身。
大多数工作都可以在Form2
完成。在“添加”或“修改”情况下,Form2
至少需要Form1
中的一个项目... Form1
DataGridView
。使用“添加”方法作为示例,为了添加新行,需要Form1
的{{1}}。这可以通过简单地为DataGridView
创建一个在其签名中带有Form2
的新构造函数来实现。以下代码是您如何从DataGridView
的{{1}}事件中调用此新构造函数。
Form1
现在我们需要在btnAdd_Click
中创建这个构造函数。由于在用户按下“添加/确定”按钮之前不会添加新行,因此我们需要保存构造函数传入的private void btnAdd_Click(object sender, EventArgs e) {
Form2 f2 = new Form2(dataGridView1);
f2.ShowDialog();
}
Form2
。因此,创建了全局Fom1
变量DataGridView
。调用构造函数时,我们只需将DataGridView
设置为传入的parentDGV
。这将允许在“添加”方法中访问网格。
parentDGV
由于我们现在可以访问DataGridView
的{{1}},因此您只需添加新行即可。没有进行错误检查,因此文本框可能为空。下面是DataGridView parentDGV;
public Form2(DataGridView dgv) {
parentDGV = dgv;
InitializeComponent();
}
的“添加”按钮点击事件。
Form1
这应该允许用户从DataGridView
的“添加”按钮Form2
private void btnAddToGrid_Click(object sender, EventArgs e) {
parentDGV.Rows.Add(txtName.Text, txtFormat.Text);
}
添加新的数据行。
接下来,我们需要关注Form1
每行的“编辑”按钮。如果要使用相同的DataGridView
编辑行,则需要进行一些更改,因为它目前只会添加行。要使Form2
正常工作,需要知道用户是否点击了DataGridView
上的“修改”或“添加”按钮。实现此目的的一种方法是为Form2
创建另一个构造函数。这个构造函数显然需要Form2
的{{1}},但它还需要点击“编辑”按钮的“行”索引。这将为我们提供要编辑的行的行索引。我们可以创建一个全局Form1
变量“editRowIndex”,以允许从Form2
中的其他方法进行访问。
Form1
DataGridView
方法通过在文本框中填入要编辑的数据对表单进行一些修改,将“添加”按钮文本更改为“更新”,更重要的是,更改按钮“单击”事件处理程序来更新网格中的行而不是添加新行。
int
以下是使用Form2
文本框中的新数据更新网格中正确行的DataGridView parentDGV;
int editRowIndex;
public Form2(DataGridView dgv, int rowIndex) {
parentDGV = dgv;
editRowIndex = rowIndex;
InitializeComponent();
SetEditForm();
}
事件。我假设一旦用户完成编辑,表单就会关闭。
SetEditForm
最后,要处理的最后一部分是当用户点击private void SetEditForm() {
btnAddToGrid.Text = "Update";
this.btnAddToGrid.Click -= this.btnAddToGrid_Click;
this.btnAddToGrid.Click += new System.EventHandler(this.btnAddToGrid_EditClick);
if (parentDGV.Rows[editRowIndex].Cells["AName"].Value != null)
txtName.Text = parentDGV.Rows[editRowIndex].Cells["AName"].Value.ToString();
else
txtName.Text = "";
if (parentDGV.Rows[editRowIndex].Cells["Format"].Value != null)
txtFormat.Text = parentDGV.Rows[editRowIndex].Cells["Format"].Value.ToString();
else
txtFormat.Text = "";
// set combo box value
}
的{{1}}中的一行上的“修改”按钮时。为了解决此问题,EditClick
的{{1}}事件已经连线。确定单击的单元格是“编辑”按钮后,我们只需使用正确的构造函数创建新的Form2
。
private void btnAddToGrid_EditClick(object sender, EventArgs e) {
parentDGV.Rows[editRowIndex].Cells["AName"].Value = txtName.Text;
parentDGV.Rows[editRowIndex].Cells["Format"].Value = txtFormat.Text;
this.Close();
}
我希望这是有道理的。将所有内容放在一起...使用“Designer”... Form1
有一个DataGridview
,其中包含两个文本框列(AName,Format)和一个第三个按钮列(编辑),可通过{{1}编辑行}。此外,DataGridView
还有一个按钮,可以通过CellClick
Form2
Form2:使用'Designer private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
if ((e.RowIndex >= 0) && (!dataGridView1.Rows[e.RowIndex].IsNewRow) ) {
if (e.ColumnIndex >= 0) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Edit") {
Form2 f2 = new Form2(dataGridView1, e.RowIndex);
f2.ShowDialog();
}
}
}
}
有两个文本框(Form1
,DataGridView
)代表“名称”和“格式”,Form2
为“添加“信息作为新项目或”更新“网格中的一行。
Form1
答案 2 :(得分:0)
对此问题的快速解决方法是使用模式对话框并将信息标记/传递到Form1中的列表。
frmNewConfig f = new frmNewConfig();
if (f.ShowDialog() == DialogResult.OK)
{
Object c = new Object();
c = (Object)f.Tag;
_yourList.Add(c);
**example**
valueA = txtValueA.Text;
valueB = txtValueB.Text;
}
现在,在Form1中,您应该有一种方法将列表绑定到DGV,例如:
yourDGV.DataSource = typeof(Object);
//OR
yourDGV.DataSource = yourList;
在尝试为其分配对象之前,不要忘记在frmLoad中创建列表实例。