微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

silverlight datagrid列表枚举找控件


  最近在用silverlight4做个小项目,遇到些问题.

  前台界面有一个DataGrid控件.



大伙应该都知道,DataGrid绑定是不能用匿名类的,所以我那里会是用的泛型结构体.别烦我啰索,也许就有很多人都忘了,这个泛型结构体有时候还是比较好用的,就当是复习了.

泛型结构如下:

@H_502_26@public struct CP<T,K> { public T Field1 { get; set; } public K Field2 { get; set; } }


好,我们再来看看界面上的代码:

界面代码:

<sdk:DataGrid Name="dgStock" IsReadOnly="True" AutoGenerateColumns="False" HorizontalContentAlignment="Center" GridLinesVisibility="All">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTextColumn Header="货物名称" MinWidth="50" Binding="{Binding Field2}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTextColumn Header="单位名称" MinWidth="50" Binding="{Binding Field4}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTextColumn Header="规格" MinWidth="50" Binding="{Binding Field5}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTextColumn Header="数量" MinWidth="50" Binding="{Binding Field3}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTextColumn Header="入库时间" MinWidth="50" Binding="{Binding Field6,StringFormat=yyyy-MM-dd}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTextColumn Header="大仓库" MinWidth="50" Binding="{Binding Field7}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTextColumn Header="存放仓库" MinWidth="50" Binding="{Binding Field7}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTextColumn Header="存放仓位" MinWidth="50" Binding="{Binding Field8}"></sdk:DataGridTextColumn>
                    <sdk:DataGridTemplateColumn Header="操作" MinWidth="50">
                        <sdk:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <sdk:Label Content="数量:" Margin="5 0 0 0"></sdk:Label>
                                    <TextBox Name="txtCount" Width="50" Height="22"></TextBox>
                                    <ComboBox Name="ddlBigdepot" Width="80" Height="22" ItemsSource="{Binding Field9}" SelectionChanged="ddlBigdepot_SelectionChanged">
                                        <ComboBox.ItemTemplate>
                                            <DataTemplate>
                                                <TextBlock Width="85" Text="{Binding Field2}" Tag="{Binding Field1}"></TextBlock>
                                            </DataTemplate>
                                        </ComboBox.ItemTemplate>
                                    </ComboBox>
                                    <ComboBox Name="ddlStorage" Width="85" Height="22" SelectionChanged="ddlStorage_SelectionChanged"></ComboBox>
                                    <ComboBox Name="ddlFreightSpace" Width="85" Height="22"></ComboBox>
                                </StackPanel>
                            </DataTemplate>
                        </sdk:DataGridTemplateColumn.CellTemplate>
                    </sdk:DataGridTemplateColumn>
                </sdk:DataGrid.Columns>
            </sdk:DataGrid>
因为这个DataGrid不需要分页,所以后台代码中,获取到数据源以后就直接绑定了.数据源就是一个List集合;

绑定数据源也就一句代码:

@H_502[email protected] = e.Result;结果运行起来数据也能正常显示.但是后面就遇到问题了.我要取到列表中每一行的第九列中的控件和值.

取值代码如下:

foreach (object obj in this.dgStock.ItemsSource)
{
     FrameworkElement frameElement = dgStock.Columns[8].GetCellContent(obj);
     if (frameElement != null)
     { 
          //取值代码; 
     }
}
但是调试了好几遍,那个frameElement就是一直为null,一直取不到值,纳闷了很多,也试了很多次.还是不知道为什么...网上查也没查到过这样的问题.

翻开以前写的其他页面代码,可是其他列表中又可以获取到值啊,界面是一样的绑定方式,后台取值的代码也是一样.觉得很奇怪,后来注意到之前的列表都是带分页的,绑定的时候就用到了一个类:PagedCollectionView

查了下msdn,很简单的说明了一下:表示用于分组、排序、筛选和导航分页数据集合的视图.后面的备注写的稍清楚点:

使用 PagedCollectionView 可为实现 IEnumerable 接口的任何集合提供分组、排序、筛选和分页功能 DataPager 控件提供一个方便的用户界面,用于使用PagedCollectionView 控制分页

可以将集合视图视为位于绑定源集合之上的一个层,您可以通过它使用排序、筛选和分组查询来导航和显示集合,所有这些操作都无需操作基础源集合本身。

看到有这个类了后,就试了一下.在用代码给列表作数据源绑定时,用上这个类.其实也就是多了一句代码,只是这样意义就完全不同了
@H_502_26@PagedCollectionView transferSource = new PagedCollectionView(e.Result); this.dgStock.ItemsSource = transferSource;这样绑定了后再一试,OK,能够找到相应的控件了...
不过现在也只是知其然而不知其所以然... 还是没明白为什么.只是知道如果要对列表的行进行枚举,就必须要将数据源经过这个类的转换,再绑定才可以...
好了.. 继续求学中.......

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐