0

我正在开发一个 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 控件未呈现给组合框项集合。当我单步执行代码时,它似乎被添加了,但它没有出现。我基本上想使用文本框将字符串项添加到我的组合框 dropDownList 中。我在这里做错了什么?

提前致谢,-DA

4

3 回答 3

0

我要说的是 MSFT 需要回到绘图板并修改 dataGridView。不要误会我的意思,它有很多很好的功能,但它的方式令人费解,并且缺乏您期望 API 支持的通用功能!似乎每次我使用 dataGridView 时,我都必须跳过箍来完成最简单的任务,但无论如何,这是我渲染文本框的 hack 工作......请记住,这是一个 HACK,远不是正确的方法这样做,哦,好吧...希望这对某人有所帮助。

    公共类 DropDownCellWithTextBox : DataGridViewComboBoxCell
    {
       ContextMenuStrip 下拉列表;
       ToolStripTextBox txtBox;
       DataGridView dgv;

       公共 DropDownCellWithTextBox(DataGridView _dgv)
       {
           dgv = _dgv;

           dropDownList = new ContextMenuStrip();

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

           dropDownList.Items.Add(txtBox);
       }

   公共覆盖无效InitializeEditingControl(int rowIndex,
   对象 initialFormattedVaulue, DataGridViewCellStyle dataGridViewCellStyle)
   {
       base.InitializeEditingControl(rowIndex,initialFormattedValue,dataGridViewCellStyle);

            ContextMenuStrip cms = DataGridView.EditingControl 作为 ContextMenuStrip;
   }

    受保护的覆盖无效 OnMouseClick(DataGridViewCellMouseEventArgs e)
    {
        //base.OnMouseClick(e)
        dropDownList.Size = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Size;
        dropDownList.Show(dgv.PointToScreen(new Point(eX, eY));
    }

    私人无效txtBx_KeyDown(对象发送者,KeyEventArgs e)
    {
        ToolStripTextBox txt = (ToolStripTextBox)sender;
        if (txt.Text == "")
            返回;

        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 = "";
            }
        }
    }
}
于 2013-04-23T02:28:13.637 回答
0

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

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

如果您的 C# 版本有,我建议您使用DataRepeater控件

于 2013-04-22T16:04:30.193 回答
0

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

于 2013-04-22T02:05:20.737 回答