用C#写的winform代码,在窗体使用combobox后,打开速度慢的问题

nikita007 2006-05-10 09:59:18
用C#写的winform代码,我在页面上使用了datagrid 和combobox后打开速度特别慢,经我测试发现datagrid对速度没影响,而是combobox对其有影响,请问如何才能提高打开的速度?
...全文
1034 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjisheng1 2006-06-29
  • 打赏
  • 举报
回复
关注
nikita007 2006-05-11
  • 打赏
  • 举报
回复
问题已经解决,我在FormLoad的时候不把combobox连接到数据库,等窗体加载后用mousedown函数加载数据,并对combobox进行数据模糊查找和编辑,谢谢大家的关注。
wumylove1234 2006-05-11
  • 打赏
  • 举报
回复
Knight94(愚翁) ( ) 信誉:110 2006-5-10 12:19:30 得分: 0



to 请问如何在每个窗体都调用conn连接而不重新连接数据库?

方法一,做成全局变量,例如:
public class PublicMember
{
private PublicMember();
public static SqlConnection myConn;
}

// Get connection use "PublicMember.myConn"

方法二,做成主窗体的局部成员,然后创建子窗体的时候,把局部成员传进去,例如:
public yourchildForm:..
{
public yourchildForm( ref SqlConnection myConn )
{
//Use "myConn" to init your class member
}



同意这种方法.或者使用MS的那个类库.
huangguangdou 2006-05-11
  • 打赏
  • 举报
回复
save
hnhl 2006-05-11
  • 打赏
  • 举报
回复
建议使用 MS Enterprise Library 微软企业库,给我们创建应用程序提供一种最佳实践,不妨有时间看看:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/EntLib.aspx
Yellow198267 2006-05-10
  • 打赏
  • 举报
回复
第一次连接速度慢
绑定combobox算法优化
Knight94 2006-05-10
  • 打赏
  • 举报
回复
to 请问如何在每个窗体都调用conn连接而不重新连接数据库?

方法一,做成全局变量,例如:
public class PublicMember
{
private PublicMember();
public static SqlConnection myConn;
}

// Get connection use "PublicMember.myConn"

方法二,做成主窗体的局部成员,然后创建子窗体的时候,把局部成员传进去,例如:
public yourchildForm:..
{
public yourchildForm( ref SqlConnection myConn )
{
//Use "myConn" to init your class member
}
鲁虾 2006-05-10
  • 打赏
  • 举报
回复
最好将数据读入内存中!
灰太狼 2006-05-10
  • 打赏
  • 举报
回复
調用數據庫的原理是這樣的,sqlconnection用於連接,dataset就是一個數據集,用在本地直接和你所要綁定的控件打交道,而它們之間的通信則用sqlDataAdapter,這相當於一個通道一樣。
所以你隻要第一次對數據庫連接成功後,把相關的數據通過sqlDataAdapter傳到Dataset後,就可以對dataset來操作了。隻有當你需要把數據回寫到數據庫時,再用dataset和數據庫通信,否則你的所有本地操作都是對dataset的操作,所以不用每個窗體都和數據庫連,隻要每個窗體都擁有一個dataset就行了,注意每個dataset都要指定和sql打交道的通道,不過這一步很容易,當你把dataset控件放入窗體時,就會自動提示你做這一步的。自己試試,我要吃飯去了。以前我也是每個窗體都connection,這樣做太慢了。也不好.
nikita007 2006-05-10
  • 打赏
  • 举报
回复
你好,我想请问一下具体的实现方法,我的主窗体是一个登陆界面,

to 这个不是主窗体,我再问一下我打开每个窗体都要重新连接数据库吗?因为我基本上每个窗体都要连接到数据库的,如果能只用一次数据库连接就能在所有的窗体上用就可以缩短你说的数据库连接的时间问题了,请问有没有好的方法?

你在每个窗体中都传进去connectionstring,那么操作数据库的时候都是新创建一个connection,那么是很慢的,如果你已经有connection了,那么操作数据库的时候,用已有的connection来操作就行了。

static void Main()
{
Application.Run(new login());

}

private void button1_Click(object sender, System.EventArgs e)
{
user_id = USER_ID.Text;
if(user_id == "")
{
MessageBox.Show("please input USER_ID");
return;
}

string user_pwd = USER_PWD.Text;
if(user_pwd == "")
{
MessageBox.Show("please input password");
return;
}


string strSQL;

strSQL = "SELECT * FROM A2_USER WHERE USER_ID = '" + user_id + "'";

SqlDataAdapter da = new SqlDataAdapter(strSQL, source);
DataSet ds = new DataSet();
da.Fill(ds,"USER");
try
{
if(ds.Tables["USER"].Rows.Count != 0)
{
if(ds.Tables["USER"].Rows[0]["USER_PWD"].ToString() == user_pwd.ToString())
{
this.Hide();
contract myForm = new contract();
myForm.ShowDialog();
this.Close();
}
else
{
MessageBox.Show("password is wrong,please enter correct password");
return;
}
}
else
{
MessageBox.Show("Not exist this user");
return;
}
}
catch
{
MessageBox.Show("exception");
}
finally
{
//this.Hide();
//this.Close();
//this.Visible = false;
}

}
internal static string user_id = user_id ;


private void login_Load(object sender, System.EventArgs e)
{
USER_PWD.PasswordChar = '*';

foreach(Control ctrl in this.Controls)
{
if ((ctrl is TextBox) || (ctrl is ComboBox)) //如果文本框或下拉框放在组合框中,你应该用如groupBox1.TextBox
{
ctrl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.EnterKeyDown);
}
}

}

private void EnterKeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.KeyCode==Keys.Enter)
{
System.Windows.Forms.SendKeys.Send("{TAB}");
}
}

private void button2_Click(object sender, System.EventArgs e)
{
this.Close();
}

请问如何在每个窗体都调用conn连接而不重新连接数据库?
灰太狼 2006-05-10
  • 打赏
  • 举报
回复
這樣來做。
在主窗體上把sqlconnection , sqlDataAdapter , dataset 等都弄好後,在form2 中(假設你的第二個窗體叫form2), 不用再出現sqlconnection和sqlDataAdapter了,隻要從工具箱中拖出一個dataset控件後,指定數據集就可以了,然後你就可以用這個datagrid來綁定這個dataset了,明白?
diandian82 2006-05-10
  • 打赏
  • 举报
回复
o
Knight94 2006-05-10
  • 打赏
  • 举报
回复
to 这个不是主窗体,我再问一下我打开每个窗体都要重新连接数据库吗?因为我基本上每个窗体都要连接到数据库的,如果能只用一次数据库连接就能在所有的窗体上用就可以缩短你说的数据库连接的时间问题了,请问有没有好的方法?

你在每个窗体中都传进去connectionstring,那么操作数据库的时候都是新创建一个connection,那么是很慢的,如果你已经有connection了,那么操作数据库的时候,用已有的connection来操作就行了。
nikita007 2006-05-10
  • 打赏
  • 举报
回复
问题尚未解决,同志仍需努力:)
nikita007 2006-05-10
  • 打赏
  • 举报
回复
那个连接的代码是写在主窗体中,然后在每个窗体中都写一条调用这个连接的代码吗?那应该写在主窗体的那个部分呢?
hsgzs 2006-05-10
  • 打赏
  • 举报
回复
一个command命令open了一次以后,如果不关闭连接,再次open就会出错
hsgzs 2006-05-10
  • 打赏
  • 举报
回复
不是每开一个窗体都要重新连接,而是你在开窗体的时候调用了方法中包含了,而且在2003中的connect连接重用性不好
nikita007 2006-05-10
  • 打赏
  • 举报
回复
这个不是主窗体,我再问一下我打开每个窗体都要重新连接数据库吗?因为我基本上每个窗体都要连接到数据库的,如果能只用一次数据库连接就能在所有的窗体上用就可以缩短你说的数据库连接的时间问题了,请问有没有好的方法?
Knight94 2006-05-10
  • 打赏
  • 举报
回复
改进的方法,如果要打开的窗体是主窗体的话,建议用splash窗体来做掩饰;
如果不是主窗体的话,如果其他地方已经连接数据库了,那么就不要重新连接了,用已有的连接即可。
nikita007 2006-05-10
  • 打赏
  • 举报
回复
那么我怎样才能缩短这部分的时间呢?
加载更多回复(14)

110,545

社区成员

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

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

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