好久没有搞WINform了,最近遇到几个问题:   
    1.   判断是否选中了DataGridView中的一条信息,或者判断是否是第一条信息。
    
    2.   在TreeView里显示多个节点.
        我现在可以显示一个节点,代码如下,但是不知道显示2个节点。
     
 public string Str_Operator = "select * from Operator";        #region //填充操作员信息 TrreView控件
        public void OperatorTreeLoad(object objTreeView, object obimage)
        {
            try
            {
                SqlDataReader dread = bOperate.getread(Str_Operator);                if (objTreeView.GetType().ToString() == "System.Windows.Forms.TreeView")
                {
                    System.Windows.Forms.ImageList imlist = (System.Windows.Forms.ImageList)obimage;                    System.Windows.Forms.TreeView TV = (System.Windows.Forms.TreeView)objTreeView;
                    TV.Nodes.Clear();                    TV.ImageList = imlist;
                    System.Windows.Forms.TreeNode TN = new System.Windows.Forms.TreeNode("武汉营业点", 0, 1);
                    while (dread.Read())
                    {
                        TN.Nodes.Add("", dread[1].ToString(), 0, 1);                    }
                    TV.Nodes.Add(TN);
                    dread.Close();
                    TV.ExpandAll();
                }
            }//
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString());
            }        }// end fi
        #endregion     3.  还有个问题,就是当我选中TREE里面的节点里的一条信息的时候,光标自动定位到DataGridView里响应的信息。
他们之间怎么相互关联的呢?    4  怎样在关闭一个窗体的同时另一个窗体更新
        比如窗体A 上有一个按钮 显示了窗体B , 窗体B在添加完记录后,就关闭,
        然后窗体A上的DATAGridView就刷新一下,显示刚才添加的记录。
        我现在用的一个笨办法,在A窗体家了一个刷新按钮,这样很不方便,每次更新了还要点下更新。     

解决方案 »

  1.   

    1.//删除选中行
            private void DelCheckRows(DataGridView dgvList,string type)
            {
                foreach (DataGridViewRow dgvr in dgvList.Rows)
                {
                    if (dgvr.Cells[0].EditedFormattedValue.ToString() == "True") //判断该复选框是否被选中 
                    {
                        string strMsgId = dgvr.Cells[1].Value.ToString();
                        MessageBoxInfo m = new MessageBoxInfo(new Guid(strMsgId));
                        if (type == "RecieverDel")//接收方删除
                        {
                            m.RecieverDeleted = true;
                            m.Save();
                        }
                    }
                }
                MessageBox.Show("删除成功");
            }
      

  2.   

    现在不是都用WPF吗?WinForm都快被淘汰了吧
      

  3.   

    第4个用委托:
    先在B窗体声明一个事件 public event System.EventHandler UpdateData;//声明一个事件当点击关闭按钮时添加事件 UpdateData(this, new EventArgs());在A窗体实例化B窗体时添加委托B ssm = new B();
                ssm.UpdateData +=new EventHandler(ssm_UpdateData);
                ssm.ShowDialog();最后 protected void ssm_UpdateData(object sender, System.EventArgs e)
    {//刷新操作}
      

  4.   

    4 可以在窗体B的Close事件中对窗体A的dataGridView做更新操作
    当窗体B关闭,窗体A就再执行一次查询
      

  5.   

    1. 判断是否选中了DataGridView中的一条信息,或者判断是否是第一条信息。
    答:int selectedIndex=dataGridView1.CurrentRow.Index;
    if(selectedIndex==0){
    是第一条信息
    }
    2,在TreeView里显示多个节点.
       我现在可以显示一个节点,代码如下,但是不知道显示2个节点。
    答:给你实例参考:
    foreach(TreeNode treeNode in treeView1.SelectedNode.Nodes)
    {
       foreach(TreeNode myNode in treeNode.Nodes)
      {
        //选定当前节点下所有节点
      } }
    3. 还有个问题,就是当我选中TREE里面的节点里的一条信息的时候,光标自动定位到DataGridView里响应的信息。
    他们之间怎么相互关联的呢?
    答:当你选中TreeView某一节点时,给DataGridView行new一selectIndexChanged事件,同时把DataGridView你需要的行选中,此时即能够关联上你定义的事件,去帮你作DataGridView控件的操作.4,怎样在关闭一个窗体的同时另一个窗体更新
       比如窗体A 上有一个按钮 显示了窗体B , 窗体B在添加完记录后,就关闭,
       然后窗体A上的DATAGridView就刷新一下,显示刚才添加的记录。
       我现在用的一个笨办法,在A窗体家了一个刷新按钮,这样很不方便,每次更新了还要点下更新。
    答:
    在BForm窗体中实例化AForm:
     AForm aform=new AForm();
    在AForm窗体中定义一全局变量public static object obj;//定义成你需要的类型,你点按钮后关闭AForm前封装此对象
    Object obj=aform.MyObject;//BForm窗休中得到你的对象
    aform.ShowDialog();
    把得到的对象obj在BForm解箱在显示出来.在AForm中定义一全局变量,最好是封装好的对象,当你在A
      

  6.   


    wpf这快就淘汰了,还没有开始呢
      

  7.   

    谁又WINFORM的项目啊,发一个[email protected]
      

  8.   


    2.递归,可以显示N多节点和N级节点
     private void bindTreeView1()
            {
                string sql = "select * from doctype where isdel=0";
                DataTable dt = db.ExecuteDataTable(sql, CommandType.Text, null);
                DataRow[] dr=dt.Select("updirid='-1'");
                for (int i = 0; i < dr.Length; i++)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dr[i]["docdirname"].ToString();
                    tn.Tag=dr[i]["docdirid"].ToString();
                    if (dr[i]["isdir"].ToString() == "1")
                    {
                        tn.ImageIndex = 0;
                        FillTree(tn, dt);                   
                    }
                    else
                    {
                        tn.ImageIndex = 1;
                    }
                    treeView1.Nodes.Add(tn);
                }
            }        private void FillTree(TreeNode node, DataTable dt)
            {
                DataRow[] dd = dt.Select("updirid='"+node.Tag.ToString()+"'");
                if (dd.Length > 0)
                {
                    for (int i = 0; i < dd.Length; i++)
                    {
                        TreeNode tnn = new TreeNode();
                        tnn.Text = dd[i]["docdirname"].ToString();
                        tnn.Tag = dd[i]["docdirid"].ToString();
                        if (dd[i]["isdir"].ToString() == "1")
                        {
                            tnn.ImageIndex = 0;
                            FillTree(tnn, dt);
                        }
                        else
                        {
                            tnn.ImageIndex = 1;
                        }
                        node.Nodes.Add(tnn);
                    }
                }
            }
      

  9.   

    问题3你是否想做个联动,,点击TreeView的节点时,DataGridView显示相应的信息?
      

  10.   

    问题4还是用事件委托好些,,
    在B窗体中定义        public delegate void FreshListTable();
            public event FreshListTable FreshListTableHandle;
    在窗体的关闭事件中调用
     FreshListTableHandle();A窗口中打开B窗口时
    B b=new B()
    b.FreshListTableHandle+=new b.FreshListTable(fresh)
    b.ShowDialog();
    privite void fresh()
    {
    //刷新的方法
    }
      

  11.   

    不可能,WPF是只是微软的一个技术,而WinForm是基本上每个非web编程都支持的形式,你说WPF能取代WinForm吗?说不定下个vs.net版本中就没WPF了,这是有可能的,不要太追这些,像linq出现的时候一些人甚至认为会取代一般sql操作数据库的方式,结果呢?
      

  12.   

    除了第二个treeview问题剩下的东西都可以用一个东西解决BindingSource,玩winform数据绑定第一件事情就要知道BindingSource很多人对这个玩意有误解,认为不就拖个控件,然后设置sql语句而已其实这个东西可以手动控制,同时也具有lz所要求的一切功能,只带状态管理,寻址,索引控制,智能联动刷新---------------
      

  13.   

    B.ShowDialog()后直接写你的刷新代码就行了.用得着那么麻烦还用委托.不值当的
      

  14.   

    2.比较简单,添加节点的时候直接用TV
    TV.ImageList = imlist;
    //System.Windows.Forms.TreeNode TN = new System.Windows.Forms.TreeNode("武汉营业点", 0, 1);
    while (dread.Read())
    {
        TV.Nodes.Add("", dread[1].ToString(), 0, 1);
    }