以下是我的示例代码,其中包含一个Datagrid,其中需要根据datagrid中更改的状态计算两个Comboboxes列(状态和当前状态)
<Window.Resources>
<staticData:StatusList x:Key="StatusList"/>
</Window.Resources>
<Grid>
<my:DataGrid x:Name="dgData" AutoGenerateColumns="False" Margin="0,-6,0,6">
<my:DataGrid.Columns>
<my:DataGridTextColumn Binding="{Binding Subject}" Header="Subject" Width="*"/>
<my:DataGridTemplateColumn Header="Status" Width="100">
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Status}"/>
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
<my:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Height="22"
ItemsSource="{StaticResource StatusList}"
SelectedItem="{Binding Status}"/>
</DataTemplate>
</my:DataGridTemplateColumn.CellEditingTemplate>
</my:DataGridTemplateColumn>
<my:DataGridTextColumn Binding="{Binding RaisedBy}" Header="Raised By" Width="100"/>
<my:DataGridTemplateColumn Header="PresentStatus" Width="100">
<my:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Height="22"
ItemsSource="{StaticResource StatusList}"
SelectedItem="{Binding Status}"/>
</DataTemplate>
</my:DataGridTemplateColumn.CellEditingTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
</my:DataGrid>
</Grid>`
C#代码
public class StatusList : List<string>
{
public StatusList()
{
this.Add("Assigned");
this.Add("Closed");
this.Add("In Progress");
this.Add("Open");
this.Add("Resolved");
}
}
所以最后我需要在保存datagrid数据时需要计算Status。如果状态值,即类似值被多次选择,那么它应该作为单个计数返回。例如,假设选择了3个组合框,1个是Open,2个是Resolved,3个是Open,那么count应该是2,因为对于open,它应该在选择多次相同值时计为单个值(或计数)。
编辑:这里我尝试了代码,因为组合框状态是可编辑的,因此如果更改值,重复值应计为一个值,但我不确定。
bool isDuplicate;
int count;
for (int nbRow = 0; nbRow < dgData.Rows.Count; nbRow++)
{
for (int nbRowCompare = nbRow; nbRowCompare < dgData.Rows.Count; nbRowCompare++)
{
isDuplicate = true;
for (int nbCol = 0; nbCol < dgData.Rows[nbRow].Cells.Count; nbCol++)
{
if (dgData[nbCol, nbRow].Value != dgData[nbCol, nbRowCompare])
{
isDuplicate = false;
count++;
break; //Exit for each column if they are not duplicate
}
}
if (isDuplicate)
{
//Do something
count++;
}
}
}
这里我尝试了代码,因为组合框状态是可编辑的,所以如果更改值,重复值应该算作一个值,但我不确定它,请以这种方式帮助我
bool isDuplicate;
int count;
for(int nbRow = 0; nbRow < dgData.Rows.Count; nbRow++){for(int nbRowCompare = nbRow; nbRowCompare < dgData.Rows.Count; nbRowCompare++){isDuplicate = true;
for(int nbCol = 0; nbCol < dgData.Rows[nbRow].Cells.Count; nbCol++)
{if(dgData[nbCol, nbRow].Value != dgData[nbCol, nbRowCompare]){isDuplicate = false;
count++;break; //Exit for each column if they are not duplicate
}}if(isDuplicate){//Do something count++;}}}
答案 0 :(得分:0)
如果我正确理解了您的问题,您需要计算DataGrid中显示的各行使用的不同Status
值的数量。
您的DataGrid可能会显示一个ObservableCollection
(或其他一些集合)对象,每个表对应一行。 (您不会在代码示例中显示ItemsSource
的任何值,但我会假设有一个。)如果此列表名为items
,并且您有using System.Linq;
,您可以使用以下方式获取不同状态的列表:
List<string> distinctStatuses = items.Select(item => item.Status)
.Distinct()
.ToList();
如果您只想要计数,可以进一步简化:
int distinctStatusCount = items.Select(item => item.Status).Distinct().Count();
我无法确定您的PresentStatus
列,因为它与您的Status
绑定在同一列,因此它只会显示相同的数据。 DataGrid中的PresentStatus
列也缺少CellTemplate
。