Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 使用单独的数据库表在DataGridComboxColumn中设置ItemSource_C#_Wpf_Xaml_Combobox_Csla - Fatal编程技术网

C# 使用单独的数据库表在DataGridComboxColumn中设置ItemSource

C# 使用单独的数据库表在DataGridComboxColumn中设置ItemSource,c#,wpf,xaml,combobox,csla,C#,Wpf,Xaml,Combobox,Csla,我的第一个问题,告诉我我做错了什么 我正在将旧的winforms代码转换为WPF,并在这一过程中学习它们。我大部分时间都很成功,但我正在处理第一个涉及数据绑定的数据表。这似乎是最难转换的,因为绑定主要是在xaml中处理的,而不是在代码中处理的 另外,它使用了CSLA,据我所知,CSLA是一种类似于MVVM的代码结构(仍在学习它们是什么) 通过一点实验,我成功地创建了一个功能正常的数据网格,但我需要将其中一列实现为组合框。它当前表示为一个数字(1-10),但我需要该数字的描述,该数字位于数据库的另

我的第一个问题,告诉我我做错了什么

我正在将旧的winforms代码转换为WPF,并在这一过程中学习它们。我大部分时间都很成功,但我正在处理第一个涉及数据绑定的数据表。这似乎是最难转换的,因为绑定主要是在xaml中处理的,而不是在代码中处理的

另外,它使用了CSLA,据我所知,CSLA是一种类似于MVVM的代码结构(仍在学习它们是什么)

通过一点实验,我成功地创建了一个功能正常的数据网格,但我需要将其中一列实现为组合框。它当前表示为一个数字(1-10),但我需要该数字的描述,该数字位于数据库的另一个表中。
在将其切换到组合框之前最初显示的数字为非LigibilityReason。我希望此值是组合框中当前选定的项

无法发布图像,因此我尝试显示数据库表的结构:

modreview

  • 回顾
  • 因特卡塞诺
  • 新推荐
  • 放映日期
  • 合格的
  • 非LigibilityReason(这是要制作成组合框的一个)
非ligibilityreason(这是与非ligibilityreason对齐的子表)

  • 非宗教的
  • 非宗教的
代码中包含了这个函数,它似乎创建了一个集合,我认为它应该是ItemsSource:

NERList.GetNameValueList();
至于ItemsSource,我需要所有的非ligReasonDesc值。当然,还有一个问题,就是让非宗教原因与非宗教原因相匹配。我发现,它似乎做了同样的事情,但没有数据库,而是使用类:

我试图复制它,因为我认为它应该在我的XAML中工作:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfTestProject"       x:Class="WpfTestProject.MainWindow"
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Window.Resources>
    <local:caseviewDataSet x:Key="caseviewDataSet"/>
    <CollectionViewSource x:Key="modreviewViewSource" 
                          Source="{Binding modreview, Source={StaticResource caseviewDataSet}}"/>
    <CollectionViewSource x:Key="noneligibilityViewSource"
                          Source="{Binding noneligreason, Source={StaticResource caseviewDataSet}}"/>
</Window.Resources>
<Grid DataContext="{StaticResource modreviewViewSource}">
    <Grid.RowDefinitions>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <DataGrid x:Name="modreviewDataGrid" 
              RowDetailsVisibilityMode="VisibleWhenSelected" 
              ItemsSource="{Binding}" 
              EnableRowVirtualization="True" 
              AutoGenerateColumns="False">            
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="reviewnumColumn" Width="SizeToHeader" Header="reviewnum" Binding="{Binding reviewnum}"/>
            <DataGridTextColumn x:Name="intcasenoColumn" Width="SizeToHeader" Header="intcaseno" Binding="{Binding intcaseno}"/>
            <DataGridCheckBoxColumn x:Name="newreferralColumn" Width="SizeToHeader" Header="newreferral" Binding="{Binding newreferral}"/>
            <DataGridTemplateColumn x:Name="screendateColumn" Width="Auto" Header="screendate">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <DatePicker SelectedDate="{Binding screendate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridCheckBoxColumn x:Name="eligibleColumn" Width="SizeToHeader" Header="eligible" Binding="{Binding eligible}"/>
            <DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
                                    ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
                                    SelectedValueBinding="{Binding noneligibilityreason}"
                                    DisplayMemberPath="Value"
                                    SelectedValuePath="Key"
                                        />

        </DataGrid.Columns>
    </DataGrid>
</Grid>
}

这段代码大部分是在我从数据源拖放时生成的,但代码后面的最后一行是我认为应该添加ItemsSource的地方。不确定它是否属于Loaded,但似乎在那里可以。也不确定是否有办法在XAML中实现这一点

我意识到我在XAML和代码中复制了设置ItemsSource,但两者都不能正常工作,所以我将两者都包括进来,以显示我尝试了哪些选项

最后,我想我应该展示我试图在WPF转换中模拟的旧winforms代码(不确定这是否足够)。我认为它使用一个隐藏的组合框来设置绑定,然后将其添加到表中:

//from Program.cs used in setupModRvwGrdHdr()
public static void ListControlBinding(ref UltraCombo comboBox, object lkupdataSource, string displayMember,
                                          string valueMember, object objDataSource, string objProp) {
        comboBox.DataSource = lkupdataSource;
        comboBox.DisplayMember = displayMember;
        if (!string.IsNullOrEmpty(valueMember))
            comboBox.ValueMember = valueMember;
        if (objDataSource != null)
            comboBox.DataBindings.Add("Value", objDataSource, objProp);
    }


//from the code for the specific winform
private void setupModRvwGrdHdr() {
        cbNonEligReason.DataBindings.Clear();
        grdModReviews.DataSource = bsModRvws;

        Program.ListControlBinding(ref cbNonEligReason, NERList.GetNameValueList(), "Value", "Key", bsModRvws,
            "NonEligibleReasonIDStr");
        cbNonEligReason.DisplayLayout.Bands[0].Columns["Key"].Hidden = true;
        cbNonEligReason.DisplayLayout.Bands[0].Columns["Value"].Header.Caption = "Noneligiblity Reason";

        grdModReviews.DisplayLayout.Bands[0].Columns["reviewnum"].CellActivation = Activation.NoEdit;
        grdModReviews.DisplayLayout.Bands[0].Columns["intcaseno"].Hidden = true;
        grdModReviews.DisplayLayout.Bands[0].Columns["noneligibilityreason"].Hidden = true;

        grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].Hidden = false;
        grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].Header.Caption = "Date of Screen";
        grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].Width = 100;
        grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].EditorComponent = dteModRvwDate;

        grdModReviews.DisplayLayout.Bands[0].Columns["eligible"].Hidden = false;
        grdModReviews.DisplayLayout.Bands[0].Columns["eligible"].Header.Caption = "Eligible";
        grdModReviews.DisplayLayout.Bands[0].Columns["eligible"].Width = 70;

        grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Hidden = false;
        grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Header.Caption =
            "Reason for Noneligibility";
        grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Width = 250;
        grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].EditorComponent = cbNonEligReason;
        grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Nullable =
            Infragistics.Win.UltraWinGrid.Nullable.Nothing;
    }
这是一个相当大的程序,CslaFactoryBusinessObjects类中可能有一些有用的函数,但我认为我应该学习如何这样做,以便更好地理解WPF中的数据操作

我已经寻找解决方案好几天了,但还没有找到一个和我的情况足够相似的案例。我只是不确定每个绑定属性是如何工作的,以及它们在这种特定情况下是如何应用的。最后不得不认输,在这里做个交代。很抱歉这么长时间,但我想说得具体一点,表明我已经做了一段时间了


请帮忙

这里有很多有用的信息,这是一个很好的开始

考虑到您的XAML绑定:

<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
                                    ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
                                    SelectedValueBinding="{Binding noneligibilityreason}"
                                    DisplayMemberPath="Value"
                                    SelectedValuePath="Key"
                                        />
上面声明CollectionViewSource实例(也称为
noneligibilityViewSource
)来自
caseviewDataSet
上名为
noneligreason
的属性。考虑到数据集的工作方式,我希望要么是一个名为
noneligreason
的数据表,要么是一个带有附加属性的定制数据集。很可能是前者

现在,在
窗口\u Loaded
事件中,您的代码相互矛盾,该事件通过编程方式将combobox的ItemSource设置为其他内容。特别是调用
NERList.GetNameValueList()的结果。我之所以说这是矛盾的,是因为XAML资源声明说这个非灵巧性值列表来自数据集上相应命名的属性,而事件中的代码说使用CSLA业务对象列表

你得弄清楚你想/应该用哪一种

PS:很可能,如果DataSet中的noneligibility属性包含数据,则无需通过调用
NERList.GetNameValueList()再次访问数据库的性能损失因为您已经有可用的数据

一旦确定哪个“源”包含组合框的项目列表,即
caseviewDataSet
中的
noneligreason
数据表或调用
NERList.GetNameValueList()返回的CSLA业务对象列表-只有这样,您才能知道DisplayMemberPath应该使用哪个属性,SelectedValuePath应该使用哪个属性

因此,如果组合框的ItemSource与声明的XAML一致,并且caseviewDataSet有另一个名为
noneligreason
的数据表,那么您需要从中找出属性的名称。例如,它可以是
noneligreasonid
noneligreasondesc
,但也可以是其他内容,具体取决于表适配器的功能。您的绑定的
DisplayMemberPath
可以是
noneligreasondesc
,您的
SelectedValuePath
可以是
noneligreasonid

如果组合框的ItemSource应该来自对
NERList.GetNameValueList()的调用然后,您需要再次确定返回的对象的属性名称。根据命名约定,我猜测它是“Name”和“Value”,这意味着
DisplayMemberPath
应该是
Value
,而
SelectedValuePath
应该设置为
Nam
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
                                    ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
                                    SelectedValueBinding="{Binding noneligibilityreason}"
                                    DisplayMemberPath="Value"
                                    SelectedValuePath="Key"
                                        />
<CollectionViewSource x:Key="noneligibilityViewSource" Source="{Binding noneligreason, Source={StaticResource caseviewDataSet}}" />
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
                                        ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
                                        SelectedValueBinding="{Binding noneligibilityreason}"
                                        DisplayMemberPath="noneligreasondesc"
                                        SelectedValuePath="noneligreasonid"
                                            />
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
                                        ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
                                        SelectedValueBinding="{Binding noneligibilityreason}"
                                        DisplayMemberPath="Value"
                                        SelectedValuePath="Name"
                                            />