接上篇
本章节主要讲述:
(1)DataGrid数据加载;
(2)DataGrid数据添加;
(3)DataGrid数据选择(获取选择的整行数据);
(4)获取DataGrid选择单元格的行号(获取选择的单元格索引和数据);
1,加载数据。设计主界面布局,如代码1,与图1所示
代码1:
<Grid>
<DataGrid x:Name="dg" SelectionMode="Extended" SelectionUnit="FullRow" AlternationCount="2" AlternatingRowBackground="Azure"
CanUserAddRows="True" CanUserReorderColumns="True" AutoGenerateColumns="False" HorizontalContentAlignment="Center"
Height="250" VerticalAlignment="Top" IsReadOnly="True">
<DataGrid.Columns >
<DataGridTextColumn x:Name="dg_id" Header="序 号" Width="Auto" Binding="{Binding Id, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn x:Name="dg_name" Header="姓 名" Width="120" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn x:Name="dg_class" Header="班 级" Width="130" Binding="{Binding Classi,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn x:Name="dg_score" Header="成 绩" Width="140" Binding="{Binding Score,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel Orientation="Horizontal">
<Button Name="mysqldata" Width="120" Height="30" HorizontalAlignment="Left" Margin="20,270,20,20" Click="mysqldata_Click">加载数据</Button>
<Button Name="increasedata" Width="120" Height="30" HorizontalAlignment="Left" Margin="20,270,20,20" Click="increasedata_Click">添加数据</Button>
<Button Name="selectdata" Width="120" Height="30" HorizontalAlignment="Left" Margin="20,270,20,20" Click="selectdata_Click">选择数据</Button>
</StackPanel>
</Grid>
图1 主界面布局
在“加载数据” 按钮下写代码2,将数据库中的数据读取出来;在NuGet中导入MySQL包;在App.config中添加连接数据库语句,如代码3;创建 ClassInfo 类存储变量,如代码4所示。
代码2:
private void mysqldata_Click(object sender, RoutedEventArgs e)
{
//-------------将数据读取到 DataGrid 表格中-----------------//
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (MySqlConnection connect = new MySqlConnection(connStr))
{
string sql = "select * from students";
MySqlCommand cmd = new MySqlCommand(sql, connect);
connect.Open();
MySqlDataReader mdr = cmd.ExecuteReader();
List<ClassInfo> classinfo = new List<ClassInfo>();
while (mdr.Read())
{
classinfo.Add(new ClassInfo() { Id = Convert.ToInt32(mdr[0]), Name = mdr[1].ToString(), Classi = mdr[2].ToString(), Score = mdr[3].ToString() });
}
dg.ItemsSource = classinfo;
connect.Close();
}
}
代码3:
<connectionStrings>
<add name="connStr" connectionString="server=localhost;database=endmill; uid=root;pwd=123456" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
代码4:
public class ClassInfo
{
public int Id { get; set; }
public string Name { get; set; }
public string Classi { get; set; }
public string Score { get; set; }
}
2,添加数据。创建子界面,如代码5与图2所示。
代码5:
<Grid>
<StackPanel>
<Label Width="100" Height="30" HorizontalAlignment="Left" Margin="10" HorizontalContentAlignment="Center">姓名</Label>
<Label Width="100" Height="30" HorizontalAlignment="Left" Margin="10" HorizontalContentAlignment="Center">班级</Label>
<Label Width="100" Height="30" HorizontalAlignment="Left" Margin="10" HorizontalContentAlignment="Center">成绩</Label>
</StackPanel>
<StackPanel>
<TextBox Name="add_name" Width="100" Height="30" HorizontalAlignment="Left" Margin="100,10,10,10"></TextBox>
<TextBox Name="add_class" Width="100" Height="30" HorizontalAlignment="Left" Margin="100,10,10,10"></TextBox>
<TextBox Name="add_score" Width="100" Height="30" HorizontalAlignment="Left" Margin="100,10,10,10"></TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Width="100" Height="30" Margin="20,100,10,10" Click="Button_Click">确认</Button>
<Button Width="100" Height="30" Margin="20,100,10,10" Click="Button_Click_1">取消</Button>
</StackPanel>
</Grid>
图2 子界面布局
在主界面 “添加数据” 按钮下写代码6,调出子界面窗体
代码6:
AddWindow addWindow = new AddWindow();
addWindow.ShowDialog();
在子界面 “确认” 按钮下写代码7,将添加的数据写到数据库中,在按主界面 “加载数据” 按钮将其加载出来。
代码7:
private void Button_Click(object sender, RoutedEventArgs e)
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (MySqlConnection connect = new MySqlConnection(connStr))
{
MySqlCommand cmd = new MySqlCommand("insert into students (name,class,score) values (@name,@class,@score)", connect);
cmd.Parameters.AddWithValue("@name", add_name.Text);
cmd.Parameters.AddWithValue("@class", add_class.Text);
cmd.Parameters.AddWithValue("@score", add_score.Text);
connect.Open();
cmd.ExecuteNonQuery();
connect.Close();
this.Close();
}
}
3,选择数据。在主界面 “选择数据” 按钮下写代码8,将在DataGrid中选择的数据在后台接收。
代码8:
ClassInfo classInfo = new ClassInfo();
private void selectdata_Click(object sender, RoutedEventArgs e)
{
//-------------读取选中行数据----------------//
var selectedRow = dg.SelectedItem as ClassInfo;
int id = selectedRow.Id;
var name = selectedRow.Name;
var classi = selectedRow.Classi;
var score = selectedRow.Score;
//-----------------------
}
运行结果如图3所示:
图3 运行结果
4 获取选择单元格的行号
var _cells = dg.SelectedCells;//获取选中单元格的列表
var rowIndex = dg.Items.IndexOf(_cells.First().Item);//获取选中单元格的行
var columnIndex = _cells.First().Column.DisplayIndex;//获取选中单元格的列
根据行、列得到单元格的值
string value=dg.Columns[columnIndex].GetCellContent(dg.Items[rowIndex]) as TextBlock).Text;
注意将DataGrid的SelectionUnit值选择"Cell"