COMO INSERIR CHECKBOX DINAMICAMENTE NO GRIDVIEW

RO.DRIGOSG 09/05/2011 14:43:02
#373524
Bom dia Pessoal,

Estou com um problema e não estou conseguindo resolver. Seguinte:

Tenho um gridview e estou tentando inserir um checkbox dinamicamente toda vez que o usuário clica no calendário, mas não esta funcionando. O problema é que não dá erro e também não aparece o checkbox na gridview. A coluna até é adicionada, mas o checkbox não aparece. Segue o código:

   

protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
CarregaGrid();
}

private void CriaGrid()
{
grdDisponibilidade.Columns.Clear();
CheckBoxField colCheckBox = new CheckBoxField();
BoundField colGrid = new BoundField();

// Adiciona CheckBox
colCheckBox.DataField = [Ô]Flag[Ô];
colCheckBox.HeaderText = [Ô]Seleção[Ô];
colCheckBox.ItemStyle.Width = 30;
colCheckBox.InsertVisible = true;
colCheckBox.ShowHeader = true;
grdDisponibilidade.Columns.Add(colCheckBox);

colGrid.HeaderText = [Ô]Inicio[Ô];
colGrid.DataField = [Ô]H_Inicio[Ô];
colGrid.ReadOnly = true;
colGrid.ItemStyle.Width = 50;
grdDisponibilidade.Columns.Add(colGrid);

colGrid = new BoundField();

colGrid.HeaderText = [Ô]Fim[Ô];
colGrid.DataField = [Ô]H_Fim[Ô];
colGrid.ReadOnly = true;
colGrid.ItemStyle.Width = 50;
grdDisponibilidade.Columns.Add(colGrid);
}

private void CarregaGrid()
{
DataSet Ds = new DataSet();
DataTable Dt = new DataTable();

//Busca Diponibilidade
Ds = Disponibilidade(Calendar1.SelectedDate.Date);

//Carrega Crid
Dt.Columns.Add([Ô]Flag[Ô], typeof(CheckBox));
Dt.Columns.Add([Ô]H_Inicio[Ô], typeof(string));
Dt.Columns.Add([Ô]H_Fim[Ô], typeof(string));
Dt.Columns.Add([Ô]CodPedido[Ô], typeof(Int32));
Dt.Columns.Add([Ô]Observacao[Ô], typeof(string));

grdDisponibilidade.DataSource = null;
CriaGrid();

CheckBox chb = new CheckBox();

foreach (DataRow Dr in Ds.Tables[0].Rows)
{
DataRow DrGrid = Dt.NewRow();

DrGrid[0] = chb;
DrGrid[1] = Dr[[Ô]H_Inicio[Ô]].ToString();
DrGrid[2] = Dr[[Ô]H_Fim[Ô]].ToString();
DrGrid[3] = Dr[[Ô]CodPedido[Ô]];
DrGrid[4] = Dr[[Ô]Observacao[Ô]].ToString();

Dt.Rows.Add(DrGrid);

}
DataSet DsGrid = new DataSet();
DsGrid.Tables.Add(Dt);
grdDisponibilidade.DataSource = DsGrid.Tables[0];
grdDisponibilidade.DataBind();
}



O erro é gerado na linha [Ô]grdDisponibilidade.DataBind();[Ô] na rotina CarregaGrid, o erro é o seguinte:

{[Ô]The data in the CheckBoxField [ô]Flag[ô] could not be parsed as a boolean value. Try using a BoundField instead.[Ô]}

Já tentei trocar para BoundField e nada da certo, tb já tentei passar valores fixos como [Ô]True ou False[Ô] e [Ô]1 ou 0[Ô] e tb não adiantou.

Alguem poderia me ajudar.
Obrigado
RO.DRIGOSG 09/05/2011 14:48:55
#373525
Retificando

Citação:

O problema é que não dá erro e também não aparece o checkbox na gridview. A coluna até é adicionada, mas o checkbox não aparece.



Isso acontece se na rotina CarregaGrid, eu não adicionar a linha DrGrid[0] = chb;
RO.DRIGOSG 11/05/2011 13:51:37
#373667
Boa tarde pessoal,

Bom depois de muito [Ô]penar[Ô], consegui inserir o o maldito checkbox no gridview e para isto tive que criar uma classe para que pudesse ser inserido o template. Peguei essa classe na net. Segue como ficou:

Classe:


   
public class GridViewTemplate: ITemplate
{

string _templateType;
string _columnName;

public GridViewTemplate(string tipo, string colname)
{
_templateType = tipo;
_columnName = colname;
}

void ITemplate.InstantiateIn(System.Web.UI.Control container)
{
switch (_templateType)
{
case [Ô]header[Ô]:
Label lbl = new Label();
lbl.Text = _columnName;
container.Controls.Add(lbl);

break;

case [Ô]checkbox[Ô]:
CheckBox chkColumn = new CheckBox();
chkColumn.ID = string.Format([Ô]chb{0}[Ô], _columnName);

container.Controls.Add(chkColumn);

break;
}
}

void tb1_DataBinding(object sender, EventArgs e)
{
CheckBox chbdata = (CheckBox)sender;

GridViewRow container = (GridViewRow)chbdata.NamingContainer;

object dataValue = DataBinder.Eval(container.DataItem, _columnName);

if (dataValue != DBNull.Value)
{
chbdata.Text = dataValue.ToString();
}
}

}



Cria a Grid

   

private void CriaGrid()
{
grdDisponibilidade.Columns.Clear();
BoundField colGrid = new BoundField();

TemplateField chbSelecao = new TemplateField();
chbSelecao.HeaderTemplate = new Classe.GridViewTemplate([Ô]header[Ô], [Ô][Ô]);
chbSelecao.ItemTemplate = new Classe.GridViewTemplate([Ô]checkbox[Ô], [Ô]Flag[Ô]);
chbSelecao.ItemStyle.Width = 30;
chbSelecao.ShowHeader = true;
chbSelecao.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
grdDisponibilidade.Columns.Add(chbSelecao);

colGrid.HeaderText = [Ô]Inicio[Ô];
colGrid.DataField = [Ô]H_Inicio[Ô];
colGrid.ReadOnly = true;
colGrid.ItemStyle.Width = 50;
colGrid.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
grdDisponibilidade.Columns.Add(colGrid);

colGrid = new BoundField();

colGrid.HeaderText = [Ô]Fim[Ô];
colGrid.DataField = [Ô]H_Fim[Ô];
colGrid.ReadOnly = true;
colGrid.ItemStyle.Width = 50;
colGrid.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
grdDisponibilidade.Columns.Add(colGrid);

colGrid = new BoundField();
colGrid.HeaderText = [Ô]Pedido[Ô];
colGrid.DataField = [Ô]CodPedido[Ô];
colGrid.ReadOnly = true;
colGrid.ItemStyle.Width = 50;
colGrid.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
grdDisponibilidade.Columns.Add(colGrid);

colGrid = new BoundField();
colGrid.HeaderText = [Ô]Observação[Ô];
colGrid.DataField = [Ô]Observacao[Ô];
colGrid.ReadOnly = true;
colGrid.ItemStyle.Width = 430;
colGrid.ItemStyle.HorizontalAlign = HorizontalAlign.Left;
grdDisponibilidade.Columns.Add(colGrid);

grdDisponibilidade.AutoGenerateColumns = false;

}



Se servir para alguem, esta ai a resolução do problema.

Falow galera.
Tópico encerrado , respostas não são mais permitidas