首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

WINfORM 中经常会遇到的有关问题

2012-08-08 
WINfORM 中经常会遇到的问题好久没有搞WINform了,最近遇到几个问题:1.判断是否选中了DataGridView中的一条

WINfORM 中经常会遇到的问题
好久没有搞WINform了,最近遇到几个问题:  
  1. 判断是否选中了DataGridView中的一条信息,或者判断是否是第一条信息。
   
  2. 在TreeView里显示多个节点.
  我现在可以显示一个节点,代码如下,但是不知道显示2个节点。
 

C# code
 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.
C# code
//删除选中行        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("删除成功");        }
[解决办法]
现在不是都用WPF吗?WinForm都快被淘汰了吧
[解决办法]
第4个用委托:
先在B窗体声明一个事件
C# code
 public event System.EventHandler UpdateData;//声明一个事件
[解决办法]
4 可以在窗体B的Close事件中对窗体A的dataGridView做更新操作
当窗体B关闭,窗体A就再执行一次查询
[解决办法]
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
[解决办法]

探讨

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

[解决办法]
百度一下,你就知道,这都是简单的。
[解决办法]

2.递归,可以显示N多节点和N级节点
C# code
 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);                }            }        }
[解决办法]
问题3你是否想做个联动,,点击TreeView的节点时,DataGridView显示相应的信息?
[解决办法]
问题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()
{
//刷新的方法
}




[解决办法]
探讨

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

[解决办法]
除了第二个treeview问题

剩下的东西都可以用一个东西解决BindingSource,玩winform数据绑定第一件事情就要知道BindingSource

很多人对这个玩意有误解,认为不就拖个控件,然后设置sql语句而已

其实这个东西可以手动控制,同时也具有lz所要求的一切功能,只带状态管理,寻址,索引控制,智能联动刷新---------------
[解决办法]
探讨

第4个用委托:
先在B窗体声明一个事件C# code
public event System.EventHandler UpdateData;//声明一个事件




当点击关闭按钮时添加事件C# code
UpdateData(this, new EventArgs());


在A窗体实例化B窗体时添加委托C# code
B ssm = new B();
……


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

热点排行