0

たとえば、新しい顧客など、データベースにレコードを追加するためにwinformsでフォームを作成しようとしています。私はエンティティフレームワークを扱っています。

私が今日までに行ったことは、エンティティ フレームワークが生成したクラスから新しい空の「Customer」オブジェクトを作成することでした。次に、この空のオブジェクトをリストに追加し、リストを datagridview のデータソースとして設定しました。

そうすれば、データベースに入力するために必要なすべてのフィールドをグリッドに自動的に配置できました。すべてが機能しました。

しかし今、クライアントは UI のより良いデザイン、つまり、グリッド行ではなく、Web ページの連絡先フォームのように見えるものを望んでいます。

手動でラベルやテキストボックスを作成せずに、db 構造に従ってすべての入力フィールドを自動的に作成して、datagridview で行ったように、そのようなものを自動的に作成するにはどうすればよいですか?

4

2 に答える 2

0

あなたの最善の策は、DataGridView を維持することですが、スタイルをオーバーライドして、グリッドから遠く離れて、上司が期待しているように見えるようにすることです。

これを達成するためのいくつかの提案:

  • 各行の間の行を削除します。
  • ヘッダーとグリッドの境界線を削除します。
  • 各行と列に多くのパディングを追加して、各エントリの間隔を空けます。より高度なものについては、グリッドの一部のコントロールの Paint メソッドをオーバーライドする必要がある場合があります。
于 2012-06-28T12:48:05.903 に答える
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 に答える