2013-04-21 67 views
0

我正在使用具有包含多个DataGridViewCell类型的列的dataGridView的C#winForm。例如如何在dataGridViewComboBoxCell中呈现多个控件类型

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

回答

0

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

+0

整晚都在寻找答案。我不能相信MSDN甚至没有任何关于这个问题的例子,甚至没有关于继承如何去做。这很愚蠢!我快要放弃了! – 2013-04-22 18:17:42

0

试图在DataGridView中渲染不同的控件类型很难。 DataGridView是为了显示数据,而不是太多控制它。

MSDN: DataGridView:在可定制的网格中显示数据。

我建议你使用DataRepeater控制,如果你的C#的版本有它

+0

这太荒谬了!我无法相信dataGridView API是多么令人费解和不完整! MSFT需要返回到绘图板!换句话说,我不能将控件添加到dataGridViewComboBoxCell dropDownList哈哈?似乎每次我需要与dataGridView一起工作时,我必须通过箍环来完成任何事情! – 2013-04-22 18:12:42

+0

我不是说你不能说我只是说你应该检查datarepeater – Nick 2013-04-22 18:25:03

0

所有我要说的是MSFT需要回到绘图板和重整的dataGridView。不要误解我的意思,它有很多很好的功能,但它的方式令人费解,缺乏你期望API支持的常见功能!似乎每次我使用dataGridView时,都必须通过箍环来完成最简单的任务,但无论如何,这是我的黑客工作来呈现文本框......请记住,这是一个HACK远不是正确的方式这样做,哦,好吧...希望这可以帮助别人。

 
    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 = ""; 
      } 
     } 
    } 
}