如何在dataGridViewComboBoxCell中呈现多个控件类型

时间:2013-04-21 23:12:46

标签: c#

我正在使用一个C#winForm,它使用一个具有多个DataGridViewCell类型的Column的dataGridView。例如

DataGridView dvg = new DataGridView();
dgv.Columns.Add("colCtrl", "Ctrl");

DataGridViewComboBoxCell cboCell = new DataGridViewComboBoxCell();

TextBox txtBox = new TextBox();
txtBox.Name = "MyTextBox";
txtBox.KeyDown += txtBox_KeyDown;

cboCell.Items.Add(txtBox);

DataGridViewRow row = new DataGridViewRow();
row.Cells.Add(cboCell);

dgv.Rows.Add(row);

private void txtBox_KeyDown(object sender, KeyEventArgs e)
{
   DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)     ((TextBox)sender).Parent;
   TextBox txtBox = (TextBox)sender;

   if (e.KeyCode == Keys.Enter)
   {
       if (!cb.Items.Contains(txtBox.Text))
           cb.Items.Add(txtBox.Text);
   }
}

textBox控件未呈现给comboBox Items集合。它似乎是在我单步执行代码时添加但它没有显示出来。我基本上喜欢使用textBox将字符串项添加到我的comboBox dropDownList中。我在这里做错了什么?

提前致谢, -DA

3 个答案:

答案 0 :(得分:0)

ComboBox中的项目是默认的字符串。在WPF中,您只需将控件添加到ComboBox即可。在Winforms中,您可能需要自定义组合框。

答案 1 :(得分:0)

尝试在DataGridView中呈现不同的控件类型很难。 DataGridView旨在显示数据而不是控制它。

来自MSDN: DataGridView:在可自定义的网格中显示数据。

如果您的C#版本有

,建议您使用DataRepeater控件

答案 2 :(得分:0)

我要说的是MSFT需要回到绘图板并修改dataGridView。不要误解我它有很多好的功能,但它的方法很复杂,缺乏你期望API支持的常用功能!似乎每次我使用dataGridView我都必须通过箍来完成最简单的任务,但无论如何,这是我的黑客工作来渲染文本框...请记住,这是一个很远的黑客这样做的正确方法,哦......希望这有助于某人。

    public class DropDownCellWithTextBox : DataGridViewComboBoxCell
    {
       ContextMenuStrip dropDownList;
       ToolStripTextBox txtBox;
       DataGridView dgv;

       public DropDownCellWithTextBox(DataGridView _dgv)
       {
           dgv = _dgv;

           dropDownList = new ContextMenuStrip();

           txtBox = new ToolStripTextBox();
           txtBox.BorderStyle = BorderStyle.FixedSingle;
           txtBox.KeyDown += txtBox_KeyDown;

           dropDownList.Items.Add(txtBox);
       }

   public override void InitializeEditingControl(int rowIndex,
   object initialFormattedVaulue, DataGridViewCellStyle dataGridViewCellStyle)
   {
       base.InitializeEditingControl(rowIndex,initialFormattedValue,dataGridViewCellStyle);

            ContextMenuStrip cms = DataGridView.EditingControl as ContextMenuStrip;
   }

    protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
    {
        //base.OnMouseClick(e)
        dropDownList.Size = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Size;
        dropDownList.Show(dgv.PointToScreen(new Point(e.X, e.Y));
    }

    private void txtBx_KeyDown(object sender, KeyEventArgs e)
    {
        ToolStripTextBox txt = (ToolStripTextBox)sender;
        if (txt.Text == "")
            return;

        if (e.KeyCode == Keys.Enter)
        {
            ToolStripMenuItem tsmi = new ToolStripMenuItem(txt.Text);
            tsmi.Name = txt.Text;

            if (!dropDownList.Items.ContainsKey(tsmi.Name))
            {
                 dropDownList.Items.Add(tsmi);
                 txt.Text = "";
            }
        }
    }
}