none
DataGridView的问题C# 数据库 多个存在一定关系的表的显示 RRS feed

  • 问题

  • 现在有两个表typhoonlist和tPathInfo,它们之间靠tID联系
    Typhoonlist的内容是有哪些typhoon
    tPathInfo的内容是每一个typhoon的详细信息
    现在需要在单击dataGridView1的某一条typhoon时候,触发dataGridView1_CellContentClick事件,开始调用tInfoDisplay(),tInfoDisplay()需要实现的功能就是在dataGridView2中显示出当前dataGridView1中这一条typhoon的详细信息(也就是显示tPathInfo的部分内容)。敬请高手帮助我完成tInfoDisplay()的编写
    鉴于之前没有可行答案,给出的奖励分数不得不还给系统,这次决定完成后给再更多的分。谢谢~~~~
    private void tInfoDisplay()
    {
    SqlConnection thisConnection = new SqlConnection(
    @"Server=(local);Integrated Security=True;" +
    "Database=Typhone");

    SqlDataAdapter thisAdapter = new SqlDataAdapter(
    "SELECT tID, tName FROM typhoonlist", thisConnection);

    SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);

    DataSet thisDataSet = new DataSet();// Create DataSet to contain related data tables, rows, and columns

    SqlDataAdapter tlistAdapter = new SqlDataAdapter(
    "SELECT * FROM typhoonlist", thisConnection);
    SqlDataAdapter tinfoAdapter = new SqlDataAdapter(
    "SELECT * FROM tPathInfo", thisConnection);
    tlistAdapter.Fill(thisDataSet, "typhoonlist");
    tinfoAdapter.Fill(thisDataSet, "tPathInfo");


    DataRelation listinfoRel = thisDataSet.Relations.Add("listinfo",
    thisDataSet.Tables["typhoonlist"].Columns["tID"],
    thisDataSet.Tables["tPathInfo"].Columns["tID"]);// Set up DataRelation between customers and orders

    // Print out
    //把每一条关于当前台风的信息写入dataGridView2
    foreach (DataRow listRow in thisDataSet.Tables["typhoonlist"].Rows)
    {
    while (listRow == dataGridView1.CurrentRow)
    {
    foreach (DataRow infoRow in listRow.GetChildRows(listinfoRel))
    {

    }
    }

    }

    dataGridView2.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) //Info表数据显示

    {

    tInfoDisplay();
    }
    2009年5月6日 1:37

答案

  • 楼主,你好

    如果你的是winform的程序,而且你的dataGridView1中的每行数据表示你说的typhoon的信息。当你选择其它的行时,dataGridView2自动根据你的dataGridView1的选择的行而更新。如果是这样,你可以使用SelectionChanged事件。
    e.g

    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
            {
                DataGridView dgv = sender as DataGridView;
                MessageBox.Show(dgv.CurrentRow.Cells[1].Value.ToString());
            }
    你可以在这个事件中根据你的选择更新dataGridView2。
    比如因为两张表是通过tID联系的,你可以通过dgv.CurrentRow.Cells[1].Value.ToString()这样的方式获得这个tID,然后作为存储过程的参数传入来获得相应的typhoon信息。然后为dataGridView2重新指定数据源即可。


    Microsoft Online Community Support
    2009年5月7日 2:21
  • 你的问题看一下,你如果是个初学者,困难在与不知道利用现有的技术实现你想要的联动效果。
      我给一些参考提示。要做到点击第一个dataGridView1里的记录,dataGridView2里显示其对应的详细信息,这个解决思路大致如下:
     1.使用DataSet没关系,强弱类型都可以,把数据从数据库取出后方绑定给dataGridView1
     2.添加dataGridView1的点击事件里的处理代码,当用户点击完后,获取点击的记录ID主要的信息,进行一次查询typhoon的详细信息。返回数据DataSet,这个数据查询和1类似
    3。把查询出的数据绑定到dataGridView2上,进行显示。
      
       不论是WinForm还是Asp.net,解决问题的思路都是相似的,只是最后的显示部分有所不同,但数据查询都是ado.net,点击处理基本都是使用的事件机制。希望对你有所帮助~
    you have a dream,you gonna protect it!
    2009年5月11日 16:06
    版主

全部回复

  • lz 你这样比较难帮得上   

    最好您能把您的数据集作成强类型化的   并且把xsd 文件发布出来
    我们就好继续跟进了
    工作突然有点忙 嘿嘿
    2009年5月6日 2:23
  • 您说的我都不懂呢 我是初学者
    1.xsd 文件是什么?是我在VS创建项目时候就有的一个文件吗?
    2.数据集强类型化我也不知道怎么做

    首先谢谢您的回帖
    我大概明白的了:我是说不清楚问题,同时可用信息给的不全,导致您无法帮助我

    这样吧,您可以告诉我,我要解决这个问题需要看C#编程中的哪一块东西,希望您能说具体点。像dataGridView这一块我具体要看它的哪些属性、方法、事件能完成我的需要。谢谢

    我现在只是很初级的入门者,程序杂乱没有结构,难为大家给我看了。
    2009年5月6日 2:57
  • 呵呵  我给您一个建立强类型数据集的简单教程

    1 打开工程
    2 添加项-〉数据集
    3 删除数据集中的所表
    4 打开左边的服务器资源管理器   把您需要的表拖近来
    5 保存


    用强类型数据集很方便  您可以搜索  tableadapter



    如果用这种方式   您的很多foreach 都可以省略掉



    工作突然有点忙 嘿嘿
    2009年5月6日 3:05
  • 楼主,你好

    如果你的是winform的程序,而且你的dataGridView1中的每行数据表示你说的typhoon的信息。当你选择其它的行时,dataGridView2自动根据你的dataGridView1的选择的行而更新。如果是这样,你可以使用SelectionChanged事件。
    e.g

    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
            {
                DataGridView dgv = sender as DataGridView;
                MessageBox.Show(dgv.CurrentRow.Cells[1].Value.ToString());
            }
    你可以在这个事件中根据你的选择更新dataGridView2。
    比如因为两张表是通过tID联系的,你可以通过dgv.CurrentRow.Cells[1].Value.ToString()这样的方式获得这个tID,然后作为存储过程的参数传入来获得相应的typhoon信息。然后为dataGridView2重新指定数据源即可。


    Microsoft Online Community Support
    2009年5月7日 2:21
  • 你的问题看一下,你如果是个初学者,困难在与不知道利用现有的技术实现你想要的联动效果。
      我给一些参考提示。要做到点击第一个dataGridView1里的记录,dataGridView2里显示其对应的详细信息,这个解决思路大致如下:
     1.使用DataSet没关系,强弱类型都可以,把数据从数据库取出后方绑定给dataGridView1
     2.添加dataGridView1的点击事件里的处理代码,当用户点击完后,获取点击的记录ID主要的信息,进行一次查询typhoon的详细信息。返回数据DataSet,这个数据查询和1类似
    3。把查询出的数据绑定到dataGridView2上,进行显示。
      
       不论是WinForm还是Asp.net,解决问题的思路都是相似的,只是最后的显示部分有所不同,但数据查询都是ado.net,点击处理基本都是使用的事件机制。希望对你有所帮助~
    you have a dream,you gonna protect it!
    2009年5月11日 16:06
    版主
  • 你都已经将两个表的数据查询出来放置与内存中了.
       两表有关系,你获取到关系键然后从内存中的另一表中检索数据,组合为你需要的新的DataTable就可以实现了.
    Beniao
    2009年5月12日 3:05
  • 综合大家的指导最后实现了需要的功能了
     private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)//Info表数据显示
            {
                string currentID;
                currentID = dataGridView1.CurrentRow.Cells[0].Value.ToString();
                tInfoDisplay(currentID);
            }
    事件换了,我才发现CellContentClick选中的只是很小的一个格子,还是选中一行比较好
       private void tInfoDisplay(string currentID)
            {           
               
                SqlConnection thisConnection = new SqlConnection(
                     @"Server=(local);Integrated Security=True;" +
                     "Database=Typhone");

                SqlDataAdapter thisAdapter = new SqlDataAdapter(
                     "SELECT tID, tName FROM typhoonlist", thisConnection);

                SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);

                DataSet thisDataSet = new DataSet();

                SqlDataAdapter tinfoAdapter = new SqlDataAdapter(
                     "SELECT * FROM tPathInfo where tID='"+currentID.ToString()+"'", thisConnection);
                tinfoAdapter.Fill(thisDataSet, "tPathInfo");


                dataGridView2.DataMember = "tPathInfo";
                dataGridView2.DataSource = thisDataSet;
                
                dataGridView2.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
            }
    我一直被DataRelation困扰了 其实不用那么复杂 呵呵
    不过我还有问题就是:这样是把查询好的符合条件的数据放在一个DataSet 里面整体绑定到dataGridView2,如果需要一行一行的把数据添加到dataGridView里面又要怎么完成呢?

    2009年5月14日 7:38