最近一直加班儿也没时间研究Silverlight了... 哎 上次研究了一下DataGrid发现这个东西真深呐 = = 可能还是因为自己见过的东西太少了所以大惊小怪了...稍微说说DataGrid吧
Datagrid实际上与vs03自带的DataGrid如出一辙,两者是相同的东西,而随着vs版本的更新,DataGrid在C#.Net的开发中被微软更改了名字:GridView,功能也更强大了,而在Silverlight中怎么又叫回DataGird了呢?不知道~这个问题可以忽略掉
首先我们先在页面中拖放一个DataGird控件
<Grid x:Name="LayoutRoot">
<StackPanel Orientation="Vertical">
<data:DataGrid x:Name="DataGrid1" Width="600" AutoGenerateColumns="true" BeginningEdit="DataGrid1_BeginningEdit" CellEditEnding="DataGrid1_CellEditEnding" CurrentCellChanged="DataGrid1_CurrentCellChanged" PreparingCellForEdit="DataGrid1_PreparingCellForEdit" SelectionChanged="DataGrid1_SelectionChanged" CellEditEnded="DataGrid1_CellEditEnded"></data:DataGrid>
</StackPanel>
</Grid>
将AutoGenerateColumns的属性设为True,这个属性用于定义是否由DataGrid自动加载绑定好的List数据
DataGrid拥有几个强大的事件:
BeginningEdit:发生于一个单元格或行进入编辑模式之前。
CellEditEnded:发生于一个单元格编辑已被确认或取消。
CellEditEnding:发生于一个单元格正在结束编辑时。
CurrentCellChanged:发生于一个单元格成为当前单元格时。
PreparingCellForEdit:发生于在DataGridTemplateColumn下的单元格进入编辑模式时。
SelectionChanged:发生于当SelectedItem或SelectedItems属性值改变时。
但这几个事件我只是拿出来做了个实力,实际应用的时候,目前还没有用到,但不代表它没用...(也不代表我没用)
#region 加载DataGrid数据#endregion
public void GridData()
{
List<Model.Person> list = new List<Model.Person>();
for (int i = 0; i < 30; i++) //写一个循环用来增加数据
{
Model.Person ps = new Model.Person(); //Person实体类
ps.ID = i;
ps.Name = "Terry" + i;
ps.Age = "abc" + i;
list.Add(ps);
list.Sort(new Tool.Comparer()); //list的排序方法,暂时不说
}
if (list.Count > 0)
{
DataGrid1.ItemsSource = list;
}
}
#endregion
#region DataGrid单元格引发的事件
private void DataGrid1_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
//tb2.Text = "当前引发了BeginningEdit事件,发生于一个单元格或行进入编辑模式之前。";
}
private void DataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
//tb3.Text = "当前引发了CellEditEnding事件,发生于一个单元格正在结束编辑时。";
}
private void DataGrid1_CurrentCellChanged(object sender, EventArgs e)
{
// tb4.Text = "当前引发了CurrentCellChanged事件,发生于一个单元格成为当前单元格时。";
}
private void DataGrid1_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
//tb5.Text = "当前引发了PreparingCellForEdit事件,发生于在DataGridTemplateColumn下的单元格进入编辑模式时.";
}
private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// tb6.Text = "当前引发了SelectionChanged事件";
}
private void DataGrid1_CellEditEnded(object sender, DataGridCellEditEndedEventArgs e)
{
//tb7.Text = "当前引发了CellEditEnded事件,发生于一个单元格编辑已被确认或取消。" + e.EditAction.ToString();
}
大家可以加上断点进入调试,然后依次查看这些事件的实际作用。
上边是AutoGenerateColumns=true的实例,那我们看看如果为false时是怎么去自己加载数据(看这个之前最好先试试上边的那个例子,因为下边说了一些动作跟上边那个例子有很大的关系)
<data:DataGrid x:Name="DataGrid1" Width="600" AutoGenerateColumns="False" BeginningEdit="DataGrid1_BeginningEdit" CellEditEnding="DataGrid1_CellEditEnding" CurrentCellChanged="DataGrid1_CurrentCellChanged" PreparingCellForEdit="DataGrid1_PreparingCellForEdit" SelectionChanged="DataGrid1_SelectionChanged" CellEditEnded="DataGrid1_CellEditEnded">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="编号" IsReadOnly="True" Binding="{Binding ID,Mode=OneWay}" />
<!-- IsReadOnly="True" 只读字段无法进行任何操作 -->
<data:DataGridTemplateColumn Header="ID">
<data:DataGridTemplateColumn.CellTemplate>
<!-- CellTemplate查看状态 配合CellEditingTemplate使用 -->
<DataTemplate>
<TextBlock x:Name="ID1" Text="{Binding Name}"></TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<!-- CellEditingTemplate编辑状态 配合CellTemplate使用 -->
<DataTemplate>
<TextBox x:Name="Name1" Text="{Binding Name}"></TextBox>
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>
<data:DataGridTemplateColumn Header="控制">
<data:DataGridTemplateColumn.CellTemplate>
<!-- 按钮 可触发按钮的Click事件 -->
<DataTemplate>
<HyperlinkButton Name="Find_Edit" Content="编辑" Tag="{Binding ID}" Click="Find_Edit_Click"></HyperlinkButton>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
<data:DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel Margin="5" Orientation="Horizontal" Height="40">
<TextBlock Text="{Binding ID}" Margin="5" />
<TextBlock Text="{Binding Name}" Margin="5" />
<TextBlock Text="{Binding Age}" Margin="5" />
</StackPanel>
</DataTemplate>
</data:DataGrid.RowDetailsTemplate>
</data:DataGrid>
这里介绍一下只读字段,查看状态,编辑状态
只读字段:IsReadOnly="True"。
我们看到本心得的第一个实例中,我们双击每一个单元格时都会进入编辑状态,每一个都是这样的,但是这就引发了一个问题,如果我们不希望当前列被用户编辑怎么办?IsReadOnly="True"这个属性解决了这个问题,它把当前列的字段设置为只读形式,所以无论你怎么点,用什么牌子的鼠标点,它都不会进入编辑状态,并且不会引发相关的事件
查看状态、编辑状态:<data:DataGridTemplateColumn.CellTemplate>、<data:DataGridTemplateColumn.CellEditingTemplate>。
这两个属性,我暂且叫他们模板状态吧,他们并不是单一去使用的,而是通过鼠标双击单元格和失去鼠标焦点从而引发事件改变当前模板状态,就像第一个实例中那样,可以实现在页面中对单元格进行操作。而在其模板下,我们可以绑定各种控件(这话说的有点儿大了)
之所以是浅谈,因为我也没研究太多,我想在实际应用中,这些应该足够解决一些编程中的问题了