PDA

View Full Version : مشکل عجیب در کار با کومبو باکس ( event ها مشکل ساز شدن )



c_doost
دوشنبه 07 فروردین 1391, 22:11 عصر
سلام
من یک کومبو دارم که یک فیلد از دیتابیس را به آن بایند کردم (در فرم لود نوشتم )


private void frm_takhasos_honari_Load(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(ds, "tbl_grouphonari");
bs.DataSource = ds.Tables["tbl_grouphonari"];

cmb_reshtehonari.DataSource = ds.Tables["tbl_grouphonari"];
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";

con.Close();
}



حالا میخوام وقتی یک آیتم از این کومبو انتخاب شد با این دستور سلکت یک فیلد دیگر از دیتتابیس را بگیرم (شرط دستور سلکت آیتم انتخابی در کومبو میباشد) و عملیاتی روی آن انجام دهم

این کد را در SelectedIndexChanged کومبو نوشتم :


private void cmb_reshtehonari_SelectedIndexChanged(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd = new SqlCommand("SELECT * FROM tbl_grouphonari where reshte_honari='" + cmb_reshtehonari.Text + "'", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
code_reshte = dr["code_reshte"].ToString();
}
dr.Close();
labelX1.Text = code_reshte;
}


مشکل اینجاست که پس از فرم لود شدن دستور سلکت موجود در SelectedIndexChanged اجرا میشود:متعجب: و فقط همان همان آیتم اول موجود در کومبو را بر می گرداند

حالا وقتی دو باره هر کدوم از آیتم را انتخاب میکنم هیچ کاری انجام نمیشه و همان دستور سلکت با آیتم اول کومبو نشان داده میشود .

خیلی برام عجیه کد کامل را هم قرار میدم خواهشا کمک کنید
با تشکر



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Data.SqlClient;

namespace project_hoharmandan
{
public partial class frm_takhasos_honari : DevComponents.DotNetBar.Office2007Form
{
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;

public frm_takhasos_honari()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.;Initial Catalog=honarmand;Integrated Security=True;Pooling=False");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
}

string code_reshte="";

private void frm_takhasos_honari_Load(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
da = new SqlDataAdapter("SELECT * FROM tbl_grouphonari", con);
da.Fill(ds, "tbl_grouphonari");
bs.DataSource = ds.Tables["tbl_grouphonari"];

cmb_reshtehonari.DataSource = ds.Tables["tbl_grouphonari"];
cmb_reshtehonari.DisplayMember = "reshte_honari";
cmb_reshtehonari.ValueMember = "code_reshte";

con.Close();
}

private void buttonX1_Click(object sender, EventArgs e)
{
DataLayer.tbl_shenasetakhasosi.InsertRow(cmb_resht ehonari.Text,txt_takhasoshonari.Text,txt_shenase.T ext);
}


private void cmb_reshtehonari_SelectedIndexChanged(object sender, EventArgs e)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
cmd = new SqlCommand("SELECT * FROM tbl_grouphonari where reshte_honari='" + cmb_reshtehonari.Text + "'", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
code_reshte = dr["code_reshte"].ToString();
}
dr.Close();
labelX1.Text = code_reshte;
}

}
}

asadegha
سه شنبه 08 فروردین 1391, 04:19 صبح
باید توی رویداد SelectedValueChange بنویسی.

بجای cmb_reshtehonari.Text از cmb_reshtehonari.SelectedText استفاده کن.

FastCode
سه شنبه 08 فروردین 1391, 09:51 صبح
این چه روشیه؟
توی فرم:
bool events_disabled;
form_Load:
events_disabled=true;
blah blah blah
cmb_reshtehonari.SelectedIndex=-1;
events_disabled=false;

cmb_reshtehonari_SelectedIndexChanged:
if(events_disabled) return;
blah blah blah

asadegha
سه شنبه 08 فروردین 1391, 13:12 عصر
روش خاصی نیست. توی فرم لود میاد cmb_reshtehonari رو از حالت انتخاب در میاره. و چون توی رویداد cmb_reshtehonari_SelectedIndexChanged کد نوشته شده بنابر این دستورات داخل این رویداد اجرا میشه و از اونجا که آیتمی انتخاب نشده پس ممکنه باعث بروز خطا بشه. برای جلو گیری از خطا اومد یه متغیر سراسری از نوع bool تعریف کرد که اول true میشه مقدارش بعد SelectedIndex رو تغییر میده. حالا با این تغییر دستورات cmb_reshtehonari_SelectedIndexChanged اجرا میشه. شرط بررسی میکنه اگه متغیر events_disabled مقدارش true بود، return کنه یعنی بقیه دستورات رو انجام نده.

asadegha
سه شنبه 08 فروردین 1391, 13:14 عصر
میتونست بجای این روش از try catch برای کنترل خطا استفاده کنه که خیلی بهتر بود. یا بجای تعریف متغیر مقدار SelectedIndex رو بررسی میکرد که اگه -1 بود return کنه.

FastCode
چهارشنبه 16 فروردین 1391, 00:09 صبح
دوباره سلام.

بازم یادم رفت دو خط فاصله بزارم.
منظورم این بود که روش شما چه روشیه.یه کوچولو مثل سردرد ه