C# 如何在WPF中获取DevExpress GridControl的选定行值?
2012年10月,当我在开发windows应用程序时,我问了这个问题。现在,当我转到WPF应用程序时,我又遇到了同样的问题,即如何在WPF中获取DevExpress GridControl的选定行值?我在谷歌上找不到我的答案,上面提到的链接中的答案都不起作用。与winform gridcontrol中一样,wpf的devexpress gridcontrol中没有类似CellClick、RowClick或RowCellClick事件的内容。如果有人能解决这个问题,我会很高兴的 编辑 我已经用您在答案中更新的名称空间更新了我的应用程序,但问题仍然是一样的。我发现以下两个错误C# 如何在WPF中获取DevExpress GridControl的选定行值?,c#,wpf,devexpress,gridcontrol,C#,Wpf,Devexpress,Gridcontrol,2012年10月,当我在开发windows应用程序时,我问了这个问题。现在,当我转到WPF应用程序时,我又遇到了同样的问题,即如何在WPF中获取DevExpress GridControl的选定行值?我在谷歌上找不到我的答案,上面提到的链接中的答案都不起作用。与winform gridcontrol中一样,wpf的devexpress gridcontrol中没有类似CellClick、RowClick或RowCellClick事件的内容。如果有人能解决这个问题,我会很高兴的 编辑 我已经用您在
<Grid.DataContext>
<dxmvvm:ViewModelSource Type="{x:Type local:EntitiesViewModel}"/>
</Grid.DataContext>
1-在dxmvvm:ViewModelSource中找不到类型“dxmvvm:ViewModelSource”
2-名称“EntitiesViewModel”在命名空间“clr命名空间:DXApplication1”中不存在
我的应用程序代码如下
<Grid>
<dxg:GridControl Name="gridcontrol" AutoGenerateColumns="AddNew" HorizontalAlignment="Left" Margin="23,139,0,0" VerticalAlignment="Top" Height="315" Width="575">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="Item1"/>
<dxg:GridColumn FieldName="Item2"/>
<dxg:GridColumn FieldName="Item3"/>
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView Name="gridview" ShowTotalSummary="True" AllowEditing="False"/>
</dxg:GridControl.View>
</dxg:GridControl>
<dxe:TextEdit Name="TBItem1" Text="{Binding SelectedItem.Item1, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,10,0,0" VerticalAlignment="Top" Width="150"/>
<dxe:TextEdit Name="TBItem2" Text="{Binding SelectedItem.Item2, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,49,0,0" VerticalAlignment="Top" Width="150"/>
<dxe:TextEdit Name="TBItem3" Text="{Binding SelectedItem.Item3, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,84,0,0" VerticalAlignment="Top" Width="150"/>
<Label Content="Item1" HorizontalAlignment="Left" Margin="61,10,0,0" VerticalAlignment="Top" Width="48"/>
<Label Content="Item2" HorizontalAlignment="Left" Margin="61,49,0,0" VerticalAlignment="Top"/>
<Label Content="Item3" HorizontalAlignment="Left" Margin="61,80,0,0" VerticalAlignment="Top"/>
</Grid>
XAML
实体视图模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
namespace DXApplication1
{
public class EntitiesViewModel
{
public EntitiesViewModel()
{
LoadEntities();
}
void LoadEntities()
{
Entities = new ObservableCollection<Entity>
{
new Entity(){ Item1="A", Item2="A0", Item3="A00"},
new Entity(){ Item1="B", Item2="B0", Item3="B00"},
new Entity(){ Item1="C", Item2="C0", Item3="C00"},
};
}
public ObservableCollection<Entity> Entities { get; private set; }
public virtual Entity SelectedEntity { get; set; } // Bindable property
}
public class Entity
{
public string Item1 { get; set; }
public string Item2 { get; set; }
public string Item3 { get; set; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Collections.ObjectModel;
命名空间DXApplication1
{
公共类实体视图模型
{
公共实体视图模型()
{
加载实体();
}
void LoadEntities()
{
实体=新的可观察集合
{
新实体(){Item1=“A”,Item2=“A0”,Item3=“A00”},
新实体(){Item1=“B”,Item2=“B0”,Item3=“B00”},
新实体(){Item1=“C”,Item2=“C0”,Item3=“C00”},
};
}
公共可观测集合实体{get;private set;}
公共虚拟实体SelectedEntity{get;set;}//Bindable属性
}
公共类实体
{
公共字符串Item1{get;set;}
公共字符串Item2{get;set;}
公共字符串Item3{get;set;}
}
}
库、错误、类等的图像
查看Devexpress主页文档中的选择主题: 如果您使用的是MVVM模式,那么还应该查看 . 该示例显示了如何绑定到所选项目:
<dxg:GridControl ItemsSource="{Binding Source}" SelectedItems="{Binding Selection}">
您可以使用事件。下面是一个例子:
WPF:
private void gridControl1_CurrentItemChanged(object sender, CurrentItemChangedEventArgs e)
{
TBGRNo.Text = gridControl1.GetFocusedRowCellValue("GRNo").ToString();
TBSName.Text = gridControl1.GetFocusedRowCellValue("SName").ToString();
TBFName.Text = gridControl1.GetFocusedRowCellValue("FName").ToString();
}
事件处理程序:
private void gridControl1_CurrentItemChanged(object sender, CurrentItemChangedEventArgs e)
{
TBGRNo.Text = gridControl1.GetFocusedRowCellValue("GRNo").ToString();
TBSName.Text = gridControl1.GetFocusedRowCellValue("SName").ToString();
TBFName.Text = gridControl1.GetFocusedRowCellValue("FName").ToString();
}
我发现解决办法如下
<Grid>
<dxg:GridControl Name="gridcontrol" AutoGenerateColumns="AddNew" HorizontalAlignment="Left" Margin="23,139,0,0" VerticalAlignment="Top" Height="315" Width="575">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="Item1"/>
<dxg:GridColumn FieldName="Item2"/>
<dxg:GridColumn FieldName="Item3"/>
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView Name="gridview" ShowTotalSummary="True" AllowEditing="False"/>
</dxg:GridControl.View>
</dxg:GridControl>
<dxe:TextEdit Name="TBItem1" Text="{Binding SelectedItem.Item1, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,10,0,0" VerticalAlignment="Top" Width="150"/>
<dxe:TextEdit Name="TBItem2" Text="{Binding SelectedItem.Item2, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,49,0,0" VerticalAlignment="Top" Width="150"/>
<dxe:TextEdit Name="TBItem3" Text="{Binding SelectedItem.Item3, ElementName=gridcontrol, Mode=OneWay}" HorizontalAlignment="Left" Margin="124,84,0,0" VerticalAlignment="Top" Width="150"/>
<Label Content="Item1" HorizontalAlignment="Left" Margin="61,10,0,0" VerticalAlignment="Top" Width="48"/>
<Label Content="Item2" HorizontalAlignment="Left" Margin="61,49,0,0" VerticalAlignment="Top"/>
<Label Content="Item3" HorizontalAlignment="Left" Margin="61,80,0,0" VerticalAlignment="Top"/>
</Grid>
据我所知,您希望显示实体列表,然后提供一个用于选择其中一个实体的UI(通过gridcontrol)并在单独视图中编辑所选实体属性(通过文本编辑器) 因此,我建议您使用MVVM方法。而且,由于您已经在使用DevExpress控件,我建议您使用使MVVM尽可能简单 步骤1:定义一个ViewModel类,该类包含可通过
entities
属性使用的entities集合(您可以根据需要、根据需要以及在需要时加载这些实体),并提供SelectedEntity
属性:
public class EntitiesViewModel {
public EntitiesViewModel() {
LoadEntities();
}
void LoadEntities() {
Entities = new ObservableCollection<Entity>
{
new Entity(){ Item1="A", Item2="A0", Item3="A00"},
new Entity(){ Item1="B", Item2="B0", Item3="B00"},
new Entity(){ Item1="C", Item2="C0", Item3="C00"},
};
}
public ObservableCollection<Entity> Entities { get; private set; }
public virtual Entity SelectedEntity { get; set; } // Bindable property
}
public class Entity {
public string Item1 { get; set; }
public string Item2 { get; set; }
public string Item3 { get; set; }
}
2) 所有视图控件绑定都是“查看”DataContext(其中包含我们的ViewModel):
这种方式允许您将所有UI控件彼此解耦,并使用easy修改视图。@kashif是的,在WPF中有
GridControl.GetFocusedRowCellValue
方法,在WinForms中有GridView.GetFocusedRowCellValue
方法。如果girdview中只有一行,则您提供的解决方案不起作用。在WPF,使用事件从网格中获取值并将这些值传播到编辑器中,而不仅仅是使用数据绑定,这是错误的方式…@Dmitry这不是回答WPF biginer的正确方式。您应该像nempo那样正确地回答代码示例,以便人们可以按照您的方式来回答。告诉biginer使用数据绑定不是错误的我想要的霍尔,只是阻止你在目标平台发生变化的情况下使用习惯性方法,而不是学习平台…正确的方法是提出正确的问题,展示你的尝试和结果…@DmitryG我很抱歉问我的问题。请查看我的更新,告诉我正确的选择方法上述文本框中gridctrol中的行值。@Dmitry现在可以了吗?如果可以,我对youHi真的很满意!现在看起来好多了,但还有一些地方需要改进(视图控件之间的强依赖性,“修复”布局)…请看一看我的答案。我收到错误消息。你能提供完整的xaml吗coding@kashif我已使用所需的xaml名称空间更新了答案(请确保在项目参考中添加了DevExpress.Mvvm.vXX.X.dll库)。很抱歉再次打扰你。我对你的指导非常好奇,也非常热心。问题仍然存在。你能把你的项目上传到某个地方让我下载吗。请看我编辑的问题,了解我的答案problem@kashif我从您更新的问题中看到,您使用的是旧版本(v13.1)-请尝试使用最新版本(v15.1)。我使用的是最新版本,我不知道我的代码是否能与旧版本一起使用(我相信不能,因为此版本中没有DevExpress.Mvvm库)。我看到了DevExpress.Xpf
<dxmvvm:ViewModelSource Type="{x:Type local:EntitiesViewModel}"/>
...
Text="{Binding SelectedEntity.Item1}"
...
ItemsSource="{Binding Entities}"
SelectedItem="{Binding SelectedEntity}">