WPF Datagrid.SelectedItem的用法实践

WCF+WPF的一个项目,有两个页面具有相似的结构,一个是未读消息清单,一个是用户列表,前端都是用WPF的Datagrid实现,但是后端写的逻辑有较大差别,WCF的Message服务返回的是TRMessage类,而用户列表返回的是Datatable。前者实现起来觉得累,后来偷懒就改用Datatable了。结果出现了问题。


Message这段直接把数组给加到了datagrid的数据源,工作也正常。

        public void UpdateSource()
        {
            dataGrid_messagelist.SelectionChanged += OnMessage_Click;
            Message[] messagelist;
            try
            {
                messagelist = Portal.GetMessageList(current_user, currentPageIndex, pageSize);
                //给datagrid加上数据源 
                if (messagelist != null)
                {
                    dataGrid_messagelist.ItemsSource = messagelist;
                }
            }
            catch
            { }
        }
前端代码:

            <DataGrid AutoGenerateColumns="False" DataContext="{Binding}" Height="574" ItemsSource="{Binding}" Margin="8,70,8,0" 
                      Name="dataGrid_messagelist" >
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding MessageID}" Header="消息ID" Width="100" />
                <DataGridTextColumn Binding="{Binding MessageType}" Header="类型" Width="100" />
                <DataGridTextColumn Binding="{Binding MessageStatus}" Header="状态" Width="100" />
                <DataGridTextColumn Binding="{Binding MessageTitle}" Header="标题" Width="400" />
                <DataGridTextColumn Binding="{Binding SenderName}" Header="发送者" Width="120" />
                <DataGridTextColumn Binding="{Binding RecipientName}" Header="收件人" Width="120" />
            </DataGrid.Columns>
        </DataGrid>

当用户点击datagrid的时候,触发的响应:

        private void OnMessage_Click(object sender, SelectionChangedEventArgs e)
        {
            //要删除datagrid的选择响应,否则跳回来的时候,相当于一次selectionchange选择变更,会导致再次跳转
            dataGrid_messagelist.SelectionChanged -= OnMessage_Click;

            int mUID = ((((DataGrid)sender).SelectedItem) as Message).MessageID;//!!!这里把sender强制转回了datagrid,其选中的selecteditem转为Message对象,因而能够获取到其messageID
            //。。。。余下代码省略,关键是取得了MessageID后能够向服务器请求相应的Message详细内容,然后进行相应处理
        }

上述代码工作没有问题。但是做用户列表的时候,如法炮制,所不同的是WCF服务返回了DataTable。把DataTable绑定给DataGrid也正常: 

dataGrid_userlist.ItemsSource = userlistTable.DefaultView;
这是常见的写法,没有问题。但是套用Message列表实现的代码的时候,由于服务器返回的是DataTable了,代码相应做了修改,但是始终不能正确转换类型:

        private void OnMessage_Click(object sender, SelectionChangedEventArgs e)
        {
            //string userName = ((((DataGrid)sender).SelectedItem) as DataGridRow)["userName"].toString();//错误代码
            //string userName = ((((DataGrid)sender).SelectedItem) as User).["userName"].ToString();//错误代码<pre code_snippet_id="500265" snippet_file_name="blog_20141029_8_59773" name="code" class="csharp"><span style="white-space:pre">	</span>    //string userName = ((((DataGrid)sender).SelectedItem) as DataRow).["userName"].ToString();//错误代码
  
            string userName = ((((DataGrid)sender).SelectedItem) as DataRowView)["userName"].ToString();//正确代码,能够获得userName了 
            //....余下代码省略
         }
上述代码错误在于,SelectionChanged事件委托传递参数sender携带的对象类型并不是DataTable或者DataGrid,而是DataView对象。这一点从绑定数据源的时候就应该注意到:
dataGrid_userlist.ItemsSource = userlistTable.DefaultView;
绑定的是Datatable的DefaultView属性。因此,SelectedItem也应该转换为对应的DataRowView,而不是DataRow或者DataGridRow。这样,以数组名称操作方式从中取出所需的字段就非常容易了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值