WPF Datagrid.SelectedItem的用法实践

WPF Datagrid.SelectedItem的用法实践WCF+WPF的一个项目,有两个模块,一个是xiao

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。这样,以数组名称操作方式从中取出所需的字段就非常容易了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35156.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注