datagridview问题亟待解决!!!!

渃水 2013-05-23 10:17:33


有两个datagridview,主从关系,
上一个datagridview输入类别,下面一个输入明细
要求:类别每增加一行,明细显示空白的,但是选择已输入的类别,显示之前输入的明细(可编辑),全部输入完成之后写入数据库

我是这么个思路:把每增加一条项目时把之前一条对应的全部明细存入一个datatable,当选中项目时,显示相应的datatable,但是实现起来不报错,却不能实现,一直在找原因,不知是不是思路有错!

话说怎么不能上传图片了,不知道描述的听懂没?!
...全文
170 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
stiff_neck 2013-05-24
  • 打赏
  • 举报
回复
引用 9 楼 yuyang00000 的回复:
[quote=引用 5 楼 laipihu 的回复:] 应该是数据库主键的问题,还是输入一行保存一行,省心。
现在的关键问题不是显示,是在什么时候把数据保存进datata呢? 我有个想法,实在每次新增行时新建一个table,然后CellValueChanged()时,改变table里的值,但感觉过于麻烦了! 有什么建议没有?谢谢?[/quote] 每次datagridview_A的选择改变时(包括选择其他行和新增行两种情况),datagridview_B中的数据先保存(此时要判断B的数据源中是否已存在此数据,存在就更新,不存在就新增),然后再根据datagridview_A的选择行,显示新数据或空白数据。 另外,插入数据库的时候要先把当前数据保存一次
laipihu 2013-05-23
  • 打赏
  • 举报
回复
引用 9 楼 yuyang00000 的回复:
[quote=引用 5 楼 laipihu 的回复:] 应该是数据库主键的问题,还是输入一行保存一行,省心。
现在的关键问题不是显示,是在什么时候把数据保存进datata呢? 我有个想法,实在每次新增行时新建一个table,然后CellValueChanged()时,改变table里的值,但感觉过于麻烦了! 有什么建议没有?谢谢?[/quote] 为啥偏要存在dataTable里,直接存数据库多方便呀
stiff_neck 2013-05-23
  • 打赏
  • 举报
回复
意思是你说的太泛泛了,对解决你的问题没有帮助
渃水 2013-05-23
  • 打赏
  • 举报
回复
引用 1 楼 stiff_neck 的回复:
听懂了,但没什么意义,上代码吧
什么叫没有什么意义?我正在苦于实现!
stiff_neck 2013-05-23
  • 打赏
  • 举报
回复
听懂了,但没什么意义,上代码吧
渃水 2013-05-23
  • 打赏
  • 举报
回复
引用 5 楼 laipihu 的回复:
应该是数据库主键的问题,还是输入一行保存一行,省心。
现在的关键问题不是显示,是在什么时候把数据保存进datata呢? 我有个想法,实在每次新增行时新建一个table,然后CellValueChanged()时,改变table里的值,但感觉过于麻烦了! 有什么建议没有?谢谢?
渃水 2013-05-23
  • 打赏
  • 举报
回复
我把几个难点列了一下,有两个datagridview,就叫A和B吧 A每新增一行,B就被清空,供用户输入明细,这个应该在 UserAddedRow()事件里写。 然后用户点击A中已输入的项,B显示对应的明细(刚刚输入的),而且B要可编辑 ,这个在CellClick()里写的。 那么,这些个保存应该在哪儿写?我本来也在UserAddedRow事件里写的,但是这样用户后来编辑的明细没办法保存,要不写在CellValueChanged()里吗?但是这样不太好操作,要是写入数据库的话又太频繁了,应该会影响效率吧! 求大神具体分析!
渃水 2013-05-23
  • 打赏
  • 举报
回复
引用 5 楼 laipihu 的回复:
应该是数据库主键的问题,还是输入一行保存一行,省心。
就算是输入一行,插入一行,还是有些问题啊!大家帮我分析一下。
stiff_neck 2013-05-23
  • 打赏
  • 举报
回复
引用 4 楼 yuyang00000 的回复:
[quote=引用 3 楼 stiff_neck 的回复:] 意思是你说的太泛泛了,对解决你的问题没有帮助
        
     private void dgvItemDetailsA_UserAddedRow(object sender, DataGridViewRowEventArgs e)
        {
            DataTable dt = new DataTable();
            DataColumn dc;
            for (int i = 0; i < dgvItemMXA.Columns.Count; i++)
            {
                dc = new DataColumn();
                dc.ColumnName = dgvItemMXA.Columns[i].HeaderText.ToString();
                dt.Columns.Add(dc);
            }
            for (int j = 0; j < dgvItemMXA.Rows.Count; j++)
            {
                DataRow dr = dt.NewRow();
                for (int x = 0; x < dgvItemMXA.Columns.Count; x++)
                {
                    dr[x] = dgvItemMXA.Rows[j].Cells[x].Value;
                }
                dt.Rows.Add(dr);
            }
            dsItemMX.Tables.Add(dt);//dsItemMX全局变量
            dgvcItemMX();//清空显示新表
        }
        int preRow = 0;

        private void dgvItemDetailsA_CellClick(object sender, DataGridViewCellEventArgs e)
        {//显示已有
            if (( e.RowIndex != dgvItemDetailsA.Rows.Count-1 ) && (e.RowIndex != preRow) )
            {
                this.dgvItemMXA.Columns.Clear();//列头清空下
                dgvItemMXA.DataSource = dsItemMX.Tables[ e.RowIndex ];
            }
            preRow = e.RowIndex;
        }

我是这么写的,但是显示不了已经编辑过的[/quote] CellClick事件应该是没问题,但列头清空不需要,直接重新绑定数据源就可以 上面有点乱,断点调试下,逻辑不复杂,有什么问题很容易发现
laipihu 2013-05-23
  • 打赏
  • 举报
回复
应该是数据库主键的问题,还是输入一行保存一行,省心。
渃水 2013-05-23
  • 打赏
  • 举报
回复
引用 3 楼 stiff_neck 的回复:
意思是你说的太泛泛了,对解决你的问题没有帮助
        
     private void dgvItemDetailsA_UserAddedRow(object sender, DataGridViewRowEventArgs e)
        {
            DataTable dt = new DataTable();
            DataColumn dc;
            for (int i = 0; i < dgvItemMXA.Columns.Count; i++)
            {
                dc = new DataColumn();
                dc.ColumnName = dgvItemMXA.Columns[i].HeaderText.ToString();
                dt.Columns.Add(dc);
            }
            for (int j = 0; j < dgvItemMXA.Rows.Count; j++)
            {
                DataRow dr = dt.NewRow();
                for (int x = 0; x < dgvItemMXA.Columns.Count; x++)
                {
                    dr[x] = dgvItemMXA.Rows[j].Cells[x].Value;
                }
                dt.Rows.Add(dr);
            }
            dsItemMX.Tables.Add(dt);//dsItemMX全局变量
            dgvcItemMX();//清空显示新表
        }
        int preRow = 0;

        private void dgvItemDetailsA_CellClick(object sender, DataGridViewCellEventArgs e)
        {//显示已有
            if (( e.RowIndex != dgvItemDetailsA.Rows.Count-1 ) && (e.RowIndex != preRow) )
            {
                this.dgvItemMXA.Columns.Clear();//列头清空下
                dgvItemMXA.DataSource = dsItemMX.Tables[ e.RowIndex ];
            }
            preRow = e.RowIndex;
        }

我是这么写的,但是显示不了已经编辑过的

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧