DataGrid

16/10/2004 - 18:15 por Jorge Ochoa | Informe spam
Hola Grupo

Alguin podria decirme como puedo hacer para colocar un combo dentro de un
datagrid pero para windows o hacer como se tenia en el datagrid de 6.0 que se
colocaba un boton como si fuera un combo y en un evento podriamos llamar a
otro formulario
 

Leer las respuestas

#1 Cesarion \(Maktup\)
17/10/2004 - 16:38 | Informe spam
Bueno lo primero que tienes que hacer es crear un nuevo control que herede
de: DataGridTextBoxColumn que se comporte como un combo. aca va un ejemplo:

using System;

using System.Windows.Forms;

using System.Data;

using System.Drawing;

namespace Formularios

{

public class DataGridComboBoxColumn : DataGridTextBoxColumn

{

public NoKeyUpCombo ColumnComboBox;

private System.Windows.Forms.CurrencyManager _source;

private int _rowNum;

private bool _isEditing;

public static int _RowCount;


public DataGridComboBoxColumn() : base()

{

_source = null;

_isEditing = false;

_RowCount = -1;


ColumnComboBox = new NoKeyUpCombo();

ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;


ColumnComboBox.Leave += new EventHandler(LeaveComboBox);

// ColumnComboBox.Enter += new EventHandler(ComboMadeCurrent);

ColumnComboBox.SelectionChangeCommitted += new
EventHandler(ComboStartEditing);

ColumnComboBox.KeyDown += new KeyEventHandler(ComboKeyDown);


}

private void ComboKeyDown(object sender, System.Windows.Forms.KeyEventArgs
e)

{

if (e.KeyCode == Keys.Down)

((NoKeyUpCombo)sender).DroppedDown = true;

}



private void ComboStartEditing(object sender, EventArgs e)

{

_isEditing = true;

base.ColumnStartedEditing((Control) sender);

}

private void HandleScroll(object sender, EventArgs e)

{

if(ColumnComboBox.Visible)

ColumnComboBox.Hide();

}

// private void ComboMadeCurrent(object sender, EventArgs e)

// {

// _isEditing = true;

// }

//

private void LeaveComboBox(object sender, EventArgs e)

{

if(_isEditing)

{

SetColumnValueAtRow(_source, _rowNum, ColumnComboBox.Text);

_isEditing = false;

Invalidate();

}

ColumnComboBox.Hide();

this.DataGridTableStyle.DataGrid.Scroll -= new EventHandler(HandleScroll);


}

protected override void Edit(System.Windows.Forms.CurrencyManager source,
int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string
instantText, bool cellIsVisible)

{


base.Edit(source,rowNum, bounds, readOnly, instantText , cellIsVisible);

_rowNum = rowNum;

_source = source;


ColumnComboBox.Parent = this.TextBox.Parent;

ColumnComboBox.Location = this.TextBox.Location;

ColumnComboBox.Size = new Size(this.TextBox.Size.Width,
ColumnComboBox.Size.Height);

ColumnComboBox.SelectedIndex ColumnComboBox.FindStringExact(this.TextBox.Text);

ColumnComboBox.Text = this.TextBox.Text;

this.TextBox.Visible = false;

ColumnComboBox.Visible = true;

this.DataGridTableStyle.DataGrid.Scroll += new EventHandler(HandleScroll);


ColumnComboBox.BringToFront();

ColumnComboBox.Focus();

}

protected override bool Commit(System.Windows.Forms.CurrencyManager
dataSource, int rowNum)

{


if(_isEditing)

{

_isEditing = false;

SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text);

}

return true;

}

protected override void ConcedeFocus()

{

Console.WriteLine("ConcedeFocus");

base.ConcedeFocus();

}

protected override object
GetColumnValueAtRow(System.Windows.Forms.CurrencyManager source, int rowNum)

{

object s = base.GetColumnValueAtRow(source, rowNum);

DataView dv = (DataView)this.ColumnComboBox.DataSource;

int rowCount = dv.Count;

int i = 0;

//if things are slow, you could order your dataview

//& use binary search instead of this linear one

while (i < rowCount)

{

if( s.Equals( dv[i][this.ColumnComboBox.ValueMember]))

break;

++i;

}


if(i < rowCount)

return dv[i][this.ColumnComboBox.DisplayMember];


return DBNull.Value;

}

protected override void
SetColumnValueAtRow(System.Windows.Forms.CurrencyManager source, int rowNum,
object value)

{

object s = value;

DataView dv = (DataView)this.ColumnComboBox.DataSource;

int rowCount = dv.Count;

int i = 0;

//if things are slow, you could order your dataview

//& use binary search instead of this linear one

while (i < rowCount)

{

if( s.Equals( dv[i][this.ColumnComboBox.DisplayMember]))

break;

++i;

}

if(i < rowCount)

s = dv[i][this.ColumnComboBox.ValueMember];

else

s = DBNull.Value;

base.SetColumnValueAtRow(source, rowNum, s);

}


}

public class NoKeyUpCombo : ComboBox

{

private const int WM_KEYUP = 0x101;

/* this.KeyDown += new KeyEventHandler( this.Manejador);

public void Manejador(object sender, KeyEventArgs e)

{

}

*/

protected override void WndProc(ref System.Windows.Forms.Message m)

{

if(m.Msg == WM_KEYUP)

{

//ignore keyup to avoid problem with tabbing & dropdownlist;

return;

}

base.WndProc(ref m);

}

protected override bool IsInputKey(Keys key)

{

switch(key)

{

case Keys.Up:

case Keys.Down:

/* SendKeys.Send("{F4}");

break;

*/ case Keys.Right:

case Keys.Left:

return true;

}

return base.IsInputKey(key);

}

}

}


luego cuando crees tus tablestyles para tu grid en vez de utilizar la clase
DataGridTextBoxColumn debes utilizar la clase que acabas de crear. espero
te funciones, suerte.



"Jorge Ochoa" wrote in message
news:
Hola Grupo

Alguin podria decirme como puedo hacer para colocar un combo dentro de un
datagrid pero para windows o hacer como se tenia en el datagrid de 6.0 que


se
colocaba un boton como si fuera un combo y en un evento podriamos llamar a
otro formulario

Preguntas similares