Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中获取DevExpress GridControl的选定行值?_C#_Wpf_Devexpress_Gridcontrol - Fatal编程技术网

C# 如何在WPF中获取DevExpress GridControl的选定行值?

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事件的内容。如果有人能解决这个问题,我会很高兴的 编辑 我已经用您在

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}">