Como você recebe o nome de mapeamento adequado de uma fonte de ligação ligada a um , ou um tipo anônimo List, para usar em um DataGridTableStyle?

StackOverflow https://stackoverflow.com/questions/420386

Pergunta

Eu estou tentando criar um objeto DataGridTableStyle para que eu possa controlar as larguras de um DataGrid coluna. Eu criei um objeto BindingSource vinculado a um List. Na verdade, ele é obrigado a uma lista de tipo anônimo criado embora Linq da seguinte forma (nomes de variáveis ??mudou para maior clareza do que eu estou fazendo):

List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query;
myDataGrid.DataSource = myBindingSource;

Então eu criar um objeto DataGridTableStyle e adicioná-lo à datagrid. No entanto, nunca se aplica minhas propriedades de estilo mesa I criadas porque eu não consigo definir a propriedade myDataGridTableStyle.MappingName adequada.

Eu procurei no Google por cerca de 1/2 de uma hora e continuo vendo links para a mesma pergunta ao longo de um monte de diferentes fóruns (literalmente o mesmo texto, como alguém apenas copiado e colado a pergunta ... Eu odeio isso. ..). De qualquer forma, nenhuma das sugestões de trabalho, assim como o cara diz em todos os outros sites.

Assim que alguém aqui sabe o que eu preciso para definir a propriedade MappingName para a fim de ter o meu TableStyle realmente funcionam corretamente? Onde posso pegar o nome de? (Ele não pode estar em branco ... que só funciona com um BindingSource que é ligado a um DataTable ou SqlCeResultSet etc.).

Eu estou pensando que poderia ser um problema comigo usando Linq para criar uma versão anónima, mais especializado dos objetos com apenas os campos que eu preciso. Devo apenas tentar vincular a BindingSource diretamente ao objeto Lista? Ou talvez até mesmo vincular o DataGrid diretamente ao objeto de lista e pule a fonte de ligação completo.

Graças

PS - C #, Compact Framework v3.5

UPDATE:

Eu afixei uma resposta abaixo que resolveu o meu problema. Se é ou não é a melhor abordagem, ele fez trabalho. Worth uma olhada se você está tendo o mesmo problema que eu tinha.

Foi útil?

Solução

Eu encontrei a maneira de fazer este trabalho. Eu vou quebrá-lo em seções ...


List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

DataGridTableStyle myDataGridTableStyle = new DatGridtTableStyle();
DataGridTextBoxColumn colA = new DataGridTextBoxColumn();
DataGridTextBoxColumn colB = new DataGridTextBoxColumn();
DataGridTextBoxColumn colC = new DataGridTextBoxColumn();

colA.MappingName = "FieldA";
colA.HeaderText = "Field A";
colA.Width = 50; // or whatever;

colB.MappingName = "FieldB";
.
... etc. (lather, rinse, repeat for each column I want)
.

myDataGridTableStyle.GridColumnStyles.Add(colA);
myDataGridTableStyle.GridColumnStyles.Add(colB);
myDataGridTableStyle.GridColumnStyles.Add(colC);

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query.ToList(); // Thanks Marc Gravell

// wasn't sure what else to pass in here, but null worked.
myDataGridTableStyle.MappingName = myBindingSource.GetListName(null); 

myDataGrid.TableStyles.Clear(); // Recommended on MSDN in the code examples.
myDataGrid.TablesStyles.Add(myDataGridTableStyle);
myDataGrid.DataSource = myBindingSource;

Então, basicamente, o DataGridTableStyle.MappingName precisa saber que tipo de objeto que é o mapeamento para. Desde meu objeto é um tipo anônimo (criado com Linq), eu não sei o que é até a execução. Depois que ligam a lista do tipo anônimo para a origem da vinculação eu posso usar BindingSource.GetListName (null) para obter a representação de string do tipo anônimo.

Uma coisa a notar. Se eu apenas obrigado a myList (que é tipo "myType") diretamente para a origem da ligação, eu poderia ter utilizado apenas o string "myType" como o valor para DataGridTableStyle.MappingName.

Esperemos que este é útil para outras pessoas!

Outras dicas

Apenas para adicionar à coleção de respostas já desta página ....

Eu estava frustrado com esse mesmo problema tentando desenvolver minha aplicação punho usando o Windows Forms e estrutura compacta (para Windows Mobile 6.5).

O que eu descobri, através de comentário de Marc Gravell acima é que de fato é possível obter o MappingName tempo de execução inspecionar as propriedades do DataGrid. Fazendo isso eu descobri que quando a ligação minha List<MyType> diretamente para a propriedade DataSource do DataGrid, o DataGrid estava realmente procurando por um DataGridTableStyle com o MappingName de

"List`1"

em vez de qualquer combinação de List<MyType> ou MyType ...

Então ... colocando "List`1" em nome Mapping na Collection Editor DataGridTableStyle (em tempo de design), eu era capaz de personalizar as colunas e outras propriedades sem ter que criar todos eles em tempo de execução.

Eu só espero que isso acrescenta um pouco mais para as respostas já fornecidas. Obrigado a todos por me com as orientações.

A consulta retorna IEnumerable<T> por algum T, mas a maioria das fontes de ligação (exceto ASP.NET) requerem IList (como qualquer implementação IList<T>) - tente adicionar .ToList() -. I

myBindingSource.DataSource = query.ToList();

A BindingList<T> pode funcionar ainda melhor (se for suportado na CF 3.5), uma vez que tem melhor suporte para alguns dos cenários de ligação comum; se você precisar isso (e existe assumindo BindingList<T> na CF 3.5), você pode adicionar um método de extensão:

static BindingList<T> ToBindingList<T>(this IEnumerable<T> data)
{
    return new BindingList<T>(new List<T>(data));
}

, em seguida, ligue para:

myBindingSource.DataSource = query.ToBindingList();

Para completar, uma alternativa a um IList é IListSource (ou mesmo Type para cenários puramente metadados), razão pela qual DataSource é comumente digitado como object; Se não fosse por esta questão, o compilador provavelmente teria sido capaz de dizer-lhe o problema (ou seja, se DataSource foi definida como IList).

Eu segui esta resposta e descobriu que o MappingName sempre veio a ser o nome da classe subjacente (myType no exemplo).

Assim, parece que colocar a coleção através do BindingSource resolve o problema de qualquer maneira e que não há, então não há necessidade de BindingSource.GetListName (null).

Também achei nenhuma necessidade de ToList () a consulta como o BindingSource também vai fazer isso por você.

Muito obrigado a Jason para baixo para me colocar no caminho certo.

Eu estava enfrentando mesmo problema para definir a largura da coluna. Depois de muito R & D, eu mudei o código abaixo e seu trabalho excelentes. Código:

DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = dgCustom.DataSource.GetType().Name;

onde dgCustom é DataGrid ID em dgCustom.DataSource.GetType().Name que está funcionando perfeitamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top