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