0

我正在尝试在 winforms 中创建一个表单以将记录添加到数据库,例如新客户。我正在使用实体框架。

直到今天我所做的是从实体框架生成的类中创建一个新的空“客户”对象。然后我将此空对象添加到列表中,并将列表设置为 datagridview 的数据源。

这样我就自动在网格中输入了所有必需的字段来输入数据库。一切正常。

但是现在,客户想要更好的 UI 设计——看起来像网页中的联系表单,而不是网格行。

如何自动制作类似的东西,就像我使用 datagridview 所做的那样,根据 db 结构自动创建所有输入字段,而无需手动创建标签和文本框?

4

2 回答 2

0

我最终迭代了网格并在每次迭代中创建了文本框和标签。

void Generate_TextBoxes()
{
  // top of textboxes
  int current_top=150;
  int current_left = 1000;

  // index used to match between each textbox and the properate column in grid
  int my_index = -1;

  // iterate the grid and create textbox for each column
  foreach (DataGridViewColumn col in dataGridView_add_customer.Columns)
  {
    my_index++;

    // generate textboxes only for visible columns
    if (col.Visible == true)
    {
      // increase the top each time for space between textboxes
      current_top += 40;

      // create a second column of textboxes (not all of them in 1 long column)
      if (my_index == 6) { current_top = 190; current_left = 450; }


      TextBox t = new TextBox();
      t.Top = current_top;
      t.Left = current_left;
      t.Width = 170;
      t.TextChanged +=new EventHandler(t_TextChanged);
      // give an 'id' for each textbox with the corresponding index of the grid
      t.Name = my_index.ToString();

      Label l = new Label();
      l.Text = col.HeaderCell.Value.ToString();
      l.Top = current_top;
      l.Left = current_left + 190;

      this.Controls.Add(l);
      this.Controls.Add(t);
}

以及将文本框绑定到网格的函数:

void t_TextChanged(object sender, EventArgs e)
{
  // create a reference in order to be able to access grid properties such as rows..
  TextBox tt = (TextBox)sender;

  // access the correct cell in the grid using the Name property you gave to the textbox (it was name=current_index..)
  dataGridView_add_customer.Rows[0].Cells[int.Parse(tt.Name)].Value = tt.Text;

}

于 2012-07-26T10:38:03.073 回答
0

您最好的选择是保留 DataGridView 但覆盖样式,使其看起来远离网格,更像您的老板所期望的。

实现这一目标的一些建议:

  • 删除每行之间的线。
  • 删除标题和网格边框。
  • 为每一行和每一列添加大量填充,以便每个条目被隔开。对于更高级的东西,您可能需要覆盖网格某些控件的 Paint 方法。
于 2012-06-28T12:48:05.903 回答