PDA

View Full Version : سوال: سوال در مورد ارتباط #C با SQL



sahra76
چهارشنبه 12 تیر 1392, 11:56 صبح
سلام. من تو برنامه ای که نوشتم تکست باکسها و دیتاگرید رو اتصال دادم به بانک. میخوام به مقدار یک فیلد خاص از رکورد جاری از دیتاتیبل ای که دارم دسترسی داشته باشم اما نمنی دننم چه جوری؟! وهمچنین حرکت بین رکوردهایی که دیتاتیبل شامل میشه. فعلا از این روش استفاده می کنم که محتویات جدولو در دیتاگرید نمایش میدم و به مقدار فیلددلخواه از سطر انتخابی دسترسی پیدا میکنم.
لطفا نگین از این اطلاعات زیاده و سعی کنین لینک نذارین واس مستقیم جواب بدین.گشتم پیدا نکردم. مرسی.

amir200h
چهارشنبه 12 تیر 1392, 12:34 عصر
منظورتونو من خوب متوجه نشدم. ولی برای دسترسی به دیتاتیبل میتونین اینجوری عمل کنین
row[index satr][indexe soton]


txttest.Text = dt.Tables[0].Rows[0][0].ToString();

sahra76
چهارشنبه 12 تیر 1392, 12:46 عصر
منظورتونو من خوب متوجه نشدم. ولی برای دسترسی به دیتاتیبل میتونین اینجوری عمل کنین
row[index satr][indexe soton]



txttest.Text = dt.Tables[0].Rows[0][0].ToString();


متشکرم. میخوام به رکورد جاری دسترسی داشته باشم. از کجا باید شماره سطر رکورد جاریو بدونم؟ منظورم از حرکت بین رکوردها تغییر رکورد جاریه. میدونیم که پیش فرض رکورد جاری، اولین رکورده. میخوام به رکورد بعدی یا قبلی برم.

amir200h
چهارشنبه 12 تیر 1392, 13:11 عصر
فکر کنم این درست باشه. باز دوستان اگه کد بهتری دارن بزارن


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
int i = 0;
int index = 0;
DataTable dt = new DataTable();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=(local);database=darokhane;trusted_connecti on=yes";

SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandText = "select * from pezeshk";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = com;

da.Fill(dt);
i = dt.Rows.Count;
}

private void next_Click(object sender, EventArgs e)
{

if (index > i)
return;
esle
{
index++;
txttext.Text=dt.Rows[index][0];
}
}

private void previous_Click(object sender, EventArgs e)
{

if (index < i)
return;
esle
{
index--;
txttext.Text=dt.Rows[index][0];
}
}
}
}

amir200h
چهارشنبه 12 تیر 1392, 13:35 عصر
کد قبلی ایراد داشت درستش کردم

sahra76
چهارشنبه 12 تیر 1392, 13:40 عصر
ممنون. راه حلی که شما استفاده کردین واقعا ساده بود. من دنبال متدهایی مثل MovePrevious و MoveNext که تو VB برای حرکت به رکوردهای قبلی و بعدی هست می گشتم. شما فرض کنید چندتا تکست باکس دارم که با زدن دکمه های بعدی و قبلی و انتها و ابتدا، محتویات تکست باکس ها هم تغییر کنه. با روشی که شما گفتین باید یه اسکیوال کامند تعریف کنم که هردفه با زدن این دکمه ها،کامند تکست اون شامل select ای باشه که شذطش برابر بودن مقدار فیلد کلید اصلی باشه(که با هربار زدن این دکمه ها واکشی میشه) و بعد تکست باکس هارو هربار ست کنم.
این جالب نیست. شی DataBinding همچین متدهایی داره ولی نحوه کارکردن با اون و ارتباط دادن محتویات رکوردها به دیتاگرید، تکست باکس یا هر شی دیگه رو نمیدونم.

amir200h
چهارشنبه 12 تیر 1392, 13:44 عصر
این کد دقیقا همین کاری که شما میخواین رو میکنه. شما یک بار واکشی میکنی بعد هر تعداد تکسیت باکس که خواستین رو پر میکنین

private void previous_Click(object sender, EventArgs e)
{

if (index < i)
return;
esle
{
index--;
txttext.Text=dt.Rows[index][0];
txttext1.Text=dt.Rows[index][1];
txttext2.Text=dt.Rows[index][2];
}
}

sahra76
چهارشنبه 12 تیر 1392, 13:51 عصر
خب من فعلا از روشی که پیشنهاد دادین استفاده می کنم منتها به جای دیتاتیبل در مورد دیتا گرید به کار میگیرمش.

sahra76
چهارشنبه 12 تیر 1392, 13:55 عصر
فقط یه مشکل. این خط به نظرتون مشکلی داره؟


txtcode.Text = dtg.Rows[dtg.RowCount-1].Cells[0].Value.ToString();

من که مشکلی نمی بینم. ولی خطا میده Object reference not set to an instance of an object.
در حالی که از این تکست باکس تو همین فرم برای دسترسی به مقدار ستون اول سطر جاری دیتا گرید استفاده کردم مشکلی نداره


txtcode.Text = dtg.Rows[dtg.CurrentRow.Index].Cells[0].Value.ToString();

amir200h
چهارشنبه 12 تیر 1392, 13:57 عصر
واسه دیتاگرید میتونین تو رویداد selection change از کد زیر استفاده کنین.

[CSHARP]txttest.Text = dataGridViewX3.CurrentRow.Cells[0].Value.ToString();
txttest1.Text = dataGridViewX3.CurrentRow.Cells[1].Value.ToString();[/CSHARP

sahra76
چهارشنبه 12 تیر 1392, 14:02 عصر
واسه دیتاگرید میتونین تو رویداد selection change از کد زیر استفاده کنین.

txttest.Text = dataGridViewX3.CurrentRow.Cells[0].Value.ToString();
txttest1.Text = dataGridViewX3.CurrentRow.Cells[1].Value.ToString();

کدتونو اینجوری بنویسین

txtcode.Text = dtg.CurrentRow.Cells[0].Value.ToString()

دقت کنین میخوام بین رکوردها حرکت کنم نه ستونها. و همچنین ممکنه من سطری انتخاب نکرده باشم یا کاری با سطر جاری ندارم و بخوام به سطر مشخصی دسترسی پیدا کنم. کد اولی که گفتم خطا داره، برای دستیابی به اولین ستون از آخرین سطره.

amir200h
چهارشنبه 12 تیر 1392, 14:06 عصر
باید حداقل یک ردیف انتخاب شده باشه
واسه رفتن به ردیف بعدی از کد زیر استفاده کنید

s = dataGridViewX3.Rows[(dataGridViewX3.CurrentRow.Index) + 1].Cells[0].Value.ToString();


خاصیت selectionmod دیتاگرید رو هم روی FullRowSelect بزارین

sahra76
چهارشنبه 12 تیر 1392, 14:19 عصر
باید حداقل یک ردیف انتخاب شده باشه
واسه رفتن به ردیف بعدی از کد زیر استفاده کنید

s = dataGridViewX3.Rows[(dataGridViewX3.CurrentRow.Index) + 1].Cells[0].Value.ToString();


خاصیت selectionmod دیتاگرید رو هم روی FullRowSelect بزارین

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


txtcode.Text = dtg.Rows[dtg.RowCount-1].Cells[0].Value.ToString();

ولی خطا داره. خاصیت RowCount نعداد سطرهارو برمیگردونه من منهای 1 کردم چون اندیس سطرها از 0 شروع میشه که بشه اندیس اخرین رکورد. وقتی تریس میکنم مقداری که برمیگردونه درسته. خطاشو هم گفتم چیه. دیگه واقعا نمیدنوم مشکلش چیه.

amir200h
چهارشنبه 12 تیر 1392, 14:31 عصر
خاصیت AllowUserToAddRow رو false کن.
این کد هم آخرین خونه دیتاگرید رو انتخاب میکنه

dataGridView1.Rows[dataGridView1.Rows.Count-1].Selected = true;

amir200h
چهارشنبه 12 تیر 1392, 14:38 عصر
یا این بهتره

dataGridView1.ClearSelection();
dataGridView1.Rows[dataGridView1.Rows.Count-1].Selected = true;
dataGridView1.Rows[dataGridView1.Rows.Count-1].Cells[0].Selected = true;

مهرداد صفا
چهارشنبه 12 تیر 1392, 21:09 عصر
فقط یه مشکل. این خط به نظرتون مشکلی داره؟


txtcode.Text = dtg.Rows[dtg.RowCount-1].Cells[0].Value.ToString();

من که مشکلی نمی بینم. ولی خطا میده Object reference not set to an instance of an object.
در حالی که از این تکست باکس تو همین فرم برای دسترسی به مقدار ستون اول سطر جاری دیتا گرید استفاده کردم مشکلی نداره


txtcode.Text = dtg.Rows[dtg.CurrentRow.Index].Cells[0].Value.ToString();

با سلام.
مطمئن شوید مقدار سلول مورد نظر null نباشد:

if !(dtg.Rows[dtg.RowCount-1].Cells[0].Value ==null)
txtcode.Text = dtg.Rows[dtg.RowCount-1].Cells[0].Value.ToString();
else
txtcode.Text="";

sahra76
پنج شنبه 13 تیر 1392, 08:47 صبح
ممنون. خیر مقدارش null نیست

sahra76
پنج شنبه 13 تیر 1392, 09:23 صبح
یا این بهتره

dataGridView1.ClearSelection();
dataGridView1.Rows[dataGridView1.Rows.Count-1].Selected = true;
dataGridView1.Rows[dataGridView1.Rows.Count-1].Cells[0].Selected = true;


ممنون. با این کد سطر آخر انتخاب میشه. البته انتخاب های قبلی از حالت انتخاب درنمیاد.سطر اول که پیش فرض انتخابه رو از حالت انتخاب در میارم بعد با این کدی که نوشتین سطر آخرو انتخاب می کنم با این حال خاصیت CurrentRow مقدار صفر برمیگردونه!!!! و فایده ای نداره.

sahra76
پنج شنبه 13 تیر 1392, 09:41 صبح
ممنون. با این کد سطر آخر انتخاب میشه. البته انتخاب های قبلی از حالت انتخاب درنمیاد.سطر اول که پیش فرض انتخابه رو از حالت انتخاب در میارم بعد با این کدی که نوشتین سطر آخرو انتخاب می کنم با این حال خاصیت CurrentRow مقدار صفر برمیگردونه!!!! و فایده ای نداره.

مشکلم حل شد. کدی که میگم خطا داشت درست شد. به جای dtg.RowCount-1 باید dtg.RowCount-2 کردم. که آخرین سطرو برمیگردونه!!!!! دلیلش این بوده که دیتاگرید یه سطر اضافی خالی همیشه اخرش داره.(حواس هیچکس به این موضوع ساده نبوده:لبخندساده:) دلیل صفر برگردوندن CurrentRow هم وقتی با کد بالا انتخابش میکردم همین بوده.

amir200h
پنج شنبه 13 تیر 1392, 10:38 صبح
مشکلم حل شد. کدی که میگم خطا داشت درست شد. به جای dtg.RowCount-1 باید dtg.RowCount-2 کردم. که آخرین سطرو برمیگردونه!!!!! دلیلش این بوده که دیتاگرید یه سطر اضافی خالی همیشه اخرش داره.(حواس هیچکس به این موضوع ساده نبوده:لبخندساده:) دلیل صفر برگردوندن CurrentRow هم وقتی با کد بالا انتخابش میکردم همین بوده.

خاصیت AllowUserToAddRow رو false کن.
این کد هم آخرین خونه دیتاگرید رو انتخاب میکنه

dataGridView1.Rows[dataGridView1.Rows.Count-1].Selected = true;

دوست من گفتم که خاصیت AllowUserToAddRow رو false کن. تا این مشکل پیش نیاد

sahra76
پنج شنبه 13 تیر 1392, 13:02 عصر
حواسم بهش نبود. :خجالت: حق باشماست. مرسی