接上篇

本章节主要讲述:

(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>

WPF控件—DataGrid(2)_DataGrid

图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>

WPF控件—DataGrid(2)_DataGrid_02

图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所示:

WPF控件—DataGrid(2)_数据选择_03

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