【问题标题】:Textbox control in DataGridViewDataGridView 中的文本框控件
【发布时间】:2009-05-16 05:57:10
【问题描述】:

我正在 Windows 应用程序中使用 C# 编写数据网格视图。我想在 DataGridView 中添加文本框控件。因此,当我们运行它时,文本框应该显示在 gridview 中,我们可以在其中输入值,并且我的网格有 3 列,当我在 gridview 的第 3 列上按 tab 时,我想在网格中添加新行。

我该怎么做?

【问题讨论】:

  • 这个问题的标题可以改进。考虑将其命名为:“DataGridView 中的自定义控件”而不是“C#.NET 中的 Windows 编程”
  • 这真的应该是两个问题,“如何将控件插入到gridview中?”和“当用户点击第三列时如何在网格视图上添加一行?”。
  • 如果您详细说明一下您目前的研究成果,这里的人会更好地提供帮助。但我很确定你无法详细说明,因为你没有费心研究这个。

标签: c# winforms datagridview


【解决方案1】:

由于您的问题缺乏细节且非常笼统,因此很难提供准确的答案,但要在您的 DataGridView 中获取文本框,您需要将一些 DataGridViewTextBoxColumn 实例添加到 DataGridViewColumns 收藏。这将导致它们在每一行中填充文本框。

要检测用户何时在第 3 列按下了 Tab,您可以添加一个 1-2 像素宽的第四列,并使用 OnCellEnter 事件检测它是否已获得焦点(几乎肯定来自 Tab 键击)。

祝你好运!

【讨论】:

    【解决方案2】:

    因此,对于问题的“默认显示文本框”部分,这里是瘦身:

    在 GridView->Edit Columns 上,添加要显式使用的列。然后单击链接“将此字段转换为模板字段”。这将允许您调整为这些单元格生成的 HTML。说OK。然后转到 GridView-> 编辑模板。对于您最喜欢的 Column,将 ItemEditTemplate 复制到 ItemTemplate 中。 (ItemTemplate 是默认值。ItemEditTemplate 包含正确绑定的编辑控件。)现在您的所有数据字段都将默认为“可编辑”。

    我猜你有一个提交按钮。您需要告诉 GridView 在提交时更新行。如下所示:

        For Each r As GridViewRow In GridView1.Rows
            Dim mon = System.Int32.Parse(CType(r.FindControl("TextBox1"), TextBox).Text)
            If mon <> 0 Then GridView1.UpdateRow(r.RowIndex, False)
        Next
    

    显然,您需要在其中使用不同的逻辑,但应该应用基本的循环/findControl/updateRow 逻辑。

    微软在这里有一个演练:Performing Bulk Updates to Rows Bound to a GridView

    【讨论】:

      【解决方案3】:

      试试这个,例如,如果你想将datagridview 中的第一列设置为textbox 控件:

      private void dtgrdview_CellClick(object sender, DataGridViewCellEventArgs e)
      {
          if (e.ColumnIndex == 0)
          {
              TextBox txtbox1=new TextBox();
              dtgrdview.Controls.Add(txtbox1);
              Rectangle rectangle = dtgrdview.GetCellDisplayRectangle(0, e.RowIndex, true);
              txtbox1.Location = rectangle.Location;
              txtbox1.Size = rectangle.Size;                
              txtbox1.TextChanged += txtbox1_TextChanged; 
              txtbox1.Leave += txtbox1_Leave;                
              txtbox1.Visible = true;
          }
      
      }
      

      并且不要忘记将此事件添加到如下相同的类中,以便在单元格获得焦点时调用它:

      private void txtbox1_Leave(object sender, EventArgs e)
      {
          txtbox1.Visible = false;
      }
      
      private void txtbox1_TextChanged(object sender, EventArgs e)
      {
          dtgrdview.CurrentCell.Value = txtbox1.Text;
      }
      

      如果您还有其他问题,请随时问我 :)

      【讨论】:

        猜你喜欢
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多