我想在多个文本框中添加一行,一个datetimepicker和一个组合框(form2)到datagridview(form1)。如果我尝试添加行,它将不会加起来。我真正想要的是拥有一个集成的自动保存/自动加载,我想创建一个只有列的空白数据网格视图,以便用户可以手动添加数据行。 我会更多地解释一下我在这里建造的东西; Form1:将有一个datagridview(用于存储一些用户添加的数据),3个文本框(textbox1 =列总数[5],textbox2 =列[5]的总量,其中列[6]为“Nee”,textbox3 = textbox1 - textbox2)和一个打开form2的按钮; Form2:将有1个datetimepicker,5个文本框,1个组合框和一个按钮,它将添加datetimepicker,5个文本框和组合框作为datagridview中的新行。 我还希望在关闭和打开程序时自动保存数据并自动加载。这是我到目前为止所得到的:
程序:
using System;
using System.Windows.Forms;
namespace Javell_Administratie_Software
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run (new Overzicht());
}
}
}
Form1中:
using System;
using System.Data;
using System.Windows.Forms;
namespace Javell_Administratie_Software
{
public partial class Overzicht : Form
{
public Overzicht()
{
InitializeComponent();
dt = table;
Overzicht1.DataSource = dt;
}
public DataTable dt = new DataTable();
public DataSet ds = new DataSet();
public DataTable table
{
set
{
foreach (DataGridViewColumn col in Overzicht1.Columns)
{
dt.Columns.Add(col.Name);
col.DataPropertyName = col.Name;
}
ds.Tables.Add(dt);
}
get
{
return dt;
}
}
public void AddDataTableRow()
{
Toevoegen tv = new Toevoegen();
object row = new object[]
{
tv.dateTimePicker1.Value, tv.textBox1.Text,
tv.textBox2.Text, tv.textBox3.Text, tv.textBox4.Text,
tv.textBox5.Text, tv.comboBox1.Text
};
dt.Rows.Add(row);
Overzicht1.DataSource = dt;
Overzicht1.Update();
tv.Close();
}
public void Toevoegen1_Click(object sender, EventArgs e)
{
Toevoegen tv = new Toevoegen();
tv.Show();
}
}
}
窗口2:
using System;
using System.Windows.Forms;
namespace Javell_Administratie_Software
{
public partial class Toevoegen : Form
{
public Toevoegen()
{
InitializeComponent();
}
public void Toevoegen2_Click(object sender, EventArgs e)
{
Overzicht oz = new Overzicht();
oz.AddDataTableRow();
oz.Overzicht1.DataSource = oz.dt;
oz.Overzicht1.Update();
this.Close();
}
}
}
答案 0 :(得分:0)
您必须将公共参数添加到form2
using System;
using System.Windows.Forms;
namespace Javell_Administratie_Software
{
public partial class Toevoegen : Form
{
public Toevoegen()
{
InitializeComponent();
}
public object Row{get;set;}
public void Toevoegen2_Click(object sender, EventArgs e)
{
Row= new object[]{
tv.dateTimePicker1.Value, tv.textBox1.Text,
tv.textBox2.Text, tv.textBox3.Text, tv.textBox4.Text,
tv.textBox5.Text, tv.comboBox1.Text
};
this.Close();
}
}
}
并编辑Form1
public void AddDataTableRow(Object row)
{
dt.Rows.Add(row);
}
public void Toevoegen1_Click(object sender, EventArgs e)
{
Toevoegen tv = new Toevoegen();
tv.ShowDialog();
AddDataTableRow(tv.Row);
}
答案 1 :(得分:0)
好的,我会解决你的问题。但是,它可能需要大量的代码返工。
对于自动保存/自动加载,您需要创建Window_Closing事件以在对象上调用serialize命令。然后在主窗口初始化时,它将需要尝试反序列化您序列化的文件。向下滚动到答案部分,以查看有关如何序列化和反序列化的方法调用的几种方法。 How to save/restore serializable object to/from file?
这与1串联,你真的想创建一个类来表示进入你的数据表的数据,该数据将具有与文本框和datatimepicker相对应的属性,等等.Form2将有一个属性通过使用来自这些UI控件的数据初始化它来返回所述类的对象。因此,在从form1调用form2之后,您可以执行form2.GetMyObject(无论您命名返回对象的属性),并使用whateveryourcollectionis.Add(form.GetMyObject)将其添加到集合中。你现在可能会问为什么要经历这个?那么原因是您可以创建一个列表或其他类型的集合,您可以在其中添加类对象并将该集合BIND到datagridview的itemsSource。将UI逻辑与数据/业务逻辑分开是一种很好的做法。这对最后一项很重要。这将允许更容易的代码维护,当您需要进行更改时,它将需要更少的代码;在开始时实施它可能需要最初的工作。
您最终需要一个事件处理程序,一旦项目被添加到您的集合/数据表中,它将需要更新总数和差异并计算这将在处理对象时比解析数据更容易直接来自datagridview。