在wpf或winform中使用datagrid(或datagridview)时出现问题

本文关键字:datagridview 问题 datagrid winform wpf | 更新日期: 2023-09-27 18:29:41

我有一个带有小型数据库的数据网格(sql-compact)表包含500多行,每个块包含不同的节号;

Xamle代码:

  <Window x:Class="WpfApplication9.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="440" Width="690" Loaded="Window_Loaded">
<Grid>
    <Button Content="To TextBox" Height="29" HorizontalAlignment="Left" Margin="561,272,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <DataGrid AutoGenerateColumns="True" Height="234" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="644" />
    <CheckBox Content="Section Rate" Height="16" HorizontalAlignment="Left" Margin="126,313,0,0" Name="checkBox1" VerticalAlignment="Top" />
    <CheckBox Content="Section Result" Height="16" HorizontalAlignment="Left" Margin="28,313,0,0" Name="checkBox2" VerticalAlignment="Top" />
    <CheckBox Content="Discipline" Height="16" HorizontalAlignment="Left" Margin="28,272,0,0" Name="checkBox3" VerticalAlignment="Top" />
    <TextBox Height="54" HorizontalAlignment="Left" Margin="240,324,0,0" Name="textBox1" VerticalAlignment="Top" Width="396" />
    <CheckBox Content="Total Biology" Height="16" HorizontalAlignment="Left" Margin="113,272,0,0" Name="checkBox4" VerticalAlignment="Top" />
    <CheckBox Content="Math" Height="16" HorizontalAlignment="Left" Margin="28,351,0,0" Name="checkBox5" VerticalAlignment="Top" />
    <CheckBox Content="Physics" Height="16" HorizontalAlignment="Left" Margin="113,351,0,0" Name="checkBox6" VerticalAlignment="Top" />
</Grid>

代码behind:

private void button1_Click(object sender, RoutedEventArgs e)
    {
        DataRowView _data = dataGrid1.CurrentCell.Item as DataRowView;
        if (_data != null)
        {
            MessageBox.Show(_data.Row[0].ToString());
        }
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        SqlCeConnection con = new SqlCeConnection(@"Data Source=C:'MyDatabase1.sdf");
        con.Open();
        SqlCeDataAdapter da = new SqlCeDataAdapter("select * from StudentGroup", con);
        DataTable dt = new DataTable();
        DataSet ds = new DataSet();
        da.Fill(dt);
        dataGrid1.ItemsSource = dt.DefaultView;
        //dataGrid1.ItemsSource = ds.Tables[0].DefaultView;
        con.Close();
    }

我想根据选中的复选框将数据导出到文本框1,格式如下:第1行:组编号、组名称、学科(或总生物学:生物学栏中各行结果的总和)对于所选组号中的每个节号:下一行:(节速率或节结果,数学或物理)===>基于选中的复选框

例如:

第1行:1,GPA,100(或137=总生物学)如果SectionResultcheckbox和mathchechbox都被选中:下一行将是:80,80,90,70,54,31

我试过这个:

    DataRowView _data = dataGrid1.CurrentCell.Item as DataRowView;
        if (_data != null)
        {
            MessageBox.Show(_data.Row[0].ToString());
        }

但它不起作用。

我不知道如何处理这个问题?谢谢你的帮助。

在wpf或winform中使用datagrid(或datagridview)时出现问题

如果网格选择单元设置为"FullRow",则使用以下代码。

((DataRowView)dgGroup.SelectedItem).Row -> This will give you current data row
((DataRowView)dgGroup.SelectedItem).Row.ItemArray[0] -> This will give first column value
((DataRowView)dgGroup.SelectedItem).Row.ItemArray[1] -> This will give second column value

如果网格选择单位设置为"单元格",则使用以下代码。

(DataRowView)dgGroup.SelectedCells[0].Item -> This will give you current data row
((DataRowView)dgGroup.SelectedCells[0].Item).Row.ItemArray[0] -> This will give first column value

根据您的注释添加更多的代码以循环浏览各个部分。

            // Find index of selected row which would be group/block row. Add 1 to find first section row in that block/group.
        var index = dgGroup.Items.IndexOf(dgGroup.SelectedItem) + 1;
        // Starting from the index found above loop through section rows untill you find blank row which can be identified by checking if "Group Name" does not have any value.
        for (int i = index; i < dgGroup.Items.Count; i++)
        {
            if (((DataRowView)dgGroup.Items[i]).Row.ItemArray[1].ToString().Trim() == string.Empty)
            {
                return;
            }
            else
            {
                // Add data to textbox.
            }
        }

为了提高使用体验,您还可以考虑设置一些限制,以便用户只能选择组/块,而不能选择分区。如果你需要的话。

感谢RonakThakkar,我投票支持他的有用答案。

由于网格选择单元设置为"FullRow",所以我的问题的第一部分答案是:

private void button1_Click(object sender, RoutedEventArgs e)
{
    if (((DataRowView)dataGrid1.SelectedItem).Row.ItemArray[0].ToString() != string.Empty)
    {
        textBox1.Text=((DataRowView)dataGrid1.SelectedItem).Row.ItemArray[0].ToString()+","+((DataRowView)dataGrid1.SelectedItem).Row.ItemArray[1].ToString()+","+((DataRowView)dataGrid1.SelectedItem).Row.ItemArray[7].ToString();
    }
}

文本框中的结果为:1,GPA,100

所以剩下的部分是,我如何在行中循环,直到分隔每个块的空行?

更多解释:例如,如果用户选择第一行,选中sectionresultcheckbox和mathcheckbox,然后单击按钮,我们应该在文本框中:1,GPA,100+下一行+80 , 80, 90 ,70 ,54 ,31谢谢你的帮助。