PDA

View Full Version : سوال: مشکل در DataGridView



Hosein.Zarei
چهارشنبه 12 تیر 1387, 23:08 عصر
با عرض سلام
من در یکی از فرمهای برنامه از DGV استفاده کرده ام که نتایج یک دستور select را در آن نشان میدهد.
در یکی از فیلدها که از نوع عددی می باشد اگر رشته ای وارد شود یک پیام خطا میدهد.
چگونه باید از وارد کردن رشته در آن فیلد جلو گیری کنم؟
چگونه در صورتی که رشته وارد شد خودم یک پیام خطای فارسی بدهم؟ (چون هیچ خطایی در سی شارپ اتفاق نمی‌افتد)

لطفا به من کمک کنید

منتظرم

Sajjad.Aghapour
چهارشنبه 12 تیر 1387, 23:29 عصر
خوب اگه فقط برای نمایش داده ها از دیتاگرید استفاده می کنید خاصیت های Enable Adding ,Editing,Deleting گرید رو UnChecked کنید

Hosein.Zarei
پنج شنبه 13 تیر 1387, 00:19 صبح
از جوابتان خیلی ممنون اما:
من هم برای نمایش و هم برای ویرایش نیاز دارم.
بنابراین این روش برای من مناسب نیست.

rostamkhani
پنج شنبه 13 تیر 1387, 01:47 صبح
سلام
میتونی اون column رو با این column به نام TextBoxColumn که کدش هست جایگزین کنی





using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace TextBoxColumnFilter
{
publicclass TextBoxColumn : DataGridViewColumn
{
public TextBoxColumn() : base(newTextBoxCell())
{
}
publicoverrideDataGridViewCell CellTemplate
{
get
{
returnbase.CellTemplate;
}
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(TextBoxCe ll)))
{
thrownewInvalidCastException("Error");
}
base.CellTemplate = value;
}
}
}
publicclassTextBoxCell : DataGridViewTextBoxCell
{
public TextBoxCell() : base()
{
}
publicoverrideType EditType
{
get
{
returntypeof(EditTextBoxCell);
}
}
publicoverridevoid InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
EditTextBoxCell editingControl = base.DataGridView.EditingControl asEditTextBoxCell;
if (editingControl != null)
{
editingControl.BorderStyle = BorderStyle.None;
editingControl.AcceptsReturn = editingControl.Multiline = dataGridViewCellStyle.WrapMode == DataGridViewTriState.True;
editingControl.MaxLength = this.MaxInputLength;
string str = initialFormattedValue asstring;
if (str == null)
{
editingControl.Text = string.Empty;
}
else
{
editingControl.Text = str;
}
}

}
}
publicclassEditTextBoxCell : DataGridViewTextBoxEditingControl
{
public EditTextBoxCell() : base()
{
this.KeyPress += newKeyPressEventHandler(EditTextBoxCell_KeyPress);
}
void EditTextBoxCell_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsDigit(e.KeyChar) && ((int)e.KeyChar) != 8)
e.KeyChar = char.MinValue;

}
}
}





برای جابجا کردن Column هم میتونی از تابع ساده زیر استفاده کنی که درکد فرم هست





publicvoid AddMeTextBoxColumn(string ColumnName, string HeaderText)
{
int ColumnDisplayIndex = dataGridView1.Columns[ColumnName].DisplayIndex;
dataGridView1.Columns.Remove(ColumnName);
TextBoxColumn column_addcombo = newTextBoxColumn();
column_addcombo.DataPropertyName = ColumnName;
column_addcombo.Name = ColumnName;
column_addcombo.HeaderText = HeaderText;
column_addcombo.DisplayIndex = ColumnDisplayIndex;
dataGridView1.Columns.Add(column_addcombo);
}

Hosein.Zarei
شنبه 15 تیر 1387, 23:02 عصر
یه مشکلی با کد شما دارم
و آن این است که تابعی که برای جایجایی Column استفاده کرده ام وقتی از چند ستون استفاده می کنم مشکل پیش می آید.

یک ساده تر برای همین کاری که برنامه اتان انجام می دهد ندارید؟؟؟
همچنین از کمکتان خیلی ممنونم
منتظرم

m0rteza
شنبه 15 تیر 1387, 23:51 عصر
این مشکل با یک ifدر هنگام save حل میشه

rostamkhani
یک شنبه 16 تیر 1387, 00:09 صبح
یک راه ساده تر که شما میتونی توسط کد زیر بعد از پر کردن DataGridView خودت هر ستونی که خواستی رو معین کنی که Cell سلولهای اون Column از چه کلاسی باشن یا بطور کلی CellTemplate رو مشخص کنی



dataGridView1.Columns[0].CellTemplate = new TextBoxCell();

یا


dataGridView1.Columns["ColumnName"].CellTemplate = new TextBoxCell();

کلاس TextBoxCell هم که کدش بالا هست و خودمون نوشتیم و هر جور که بخواهیم میتونیم تغییرش بدیم

Hosein.Zarei
پنج شنبه 20 تیر 1387, 16:24 عصر
خیلی ممنون از پاسختان.
من می خواهم در دیتا گرید هیچ مقداری وارد نشود آیا این ممکن است؟؟؟
همچنین من می خواهم که با زدن کلید اینتر بجای رفتن به سطر بعد, به ستون بعدی برود. من برای اینکار در رویدادی که کلید فشرده شد اگر اینتر بود کلید Tab می فرستد.
ولی در هنگامی که فیلد در حال ویرایش است با زدن اینتر به سطر بعد می رود چگونه باید این مشکل را حل کنم؟؟؟

Hosein.Zarei
شنبه 22 تیر 1387, 07:41 صبح
این مشکل قابل حل نیست؟؟؟(با زدن اینتر به ستون بعدی برود)

rostamkhani
شنبه 22 تیر 1387, 10:07 صبح
آقا بنده برسی کرد ولی به نتیجه ای نرسیدم

zealot
شنبه 22 تیر 1387, 17:09 عصر
میتونی تو رویداد keyprees تکس باکست این کد رو بنویسی تا فقط عدد بگیره
if(char.isdigit(e.keychar==false)e.handeled==true;

Hosein.Zarei
شنبه 22 تیر 1387, 17:20 عصر
rostamkhani (http://barnamenevis.org/forum/member.php?u=22652) خیلی از تون ممنونم
من مشکل رفتن به ستون بعد هنگام فشردن دکمه اینتر بعد از ویرایش سلول را دارم.
هنگامی که در حالت عادی است مشکلی نیست ولی در هنگام ویرایش نتوانستم کاری بکنم.
با تشکر از دوستان

rostamkhani
شنبه 22 تیر 1387, 23:17 عصر
خواهش میکنم بنده هم از شما ممنونم باهم یه چیزی یاد گرفتیم
در مورد اینتر بعد از ویرایش هم تنها رویدادی که اتفاق می افتاد CellEndEdit بود و RowLeave ,CellStateChanged
که با مخلوط این سه تا هم کاری نتونستم بکنم
فکر کنم باید با Reflector http://www.aisto.com/roeder/dotnet باید کد DataGridView رو بکشیم بیرون و آن جوری که میخواهیم درستش کنیم
بنده قبلا برای بعضی از کلاسهای net. این کارو کردم و کار زیاد سختیم نیست
موفق باشید .

Hosein.Zarei
پنج شنبه 03 مرداد 1387, 00:54 صبح
من این راه حل این مشکل را پیدا کردم:



class myDataGridView : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Enter)
{
int col = this.CurrentCell.ColumnIndex;
int row = this.CurrentCell.RowIndex;

if (row != this.NewRowIndex)
{
if (col == (this.Columns.Count - 1))
{
col = -1;
row++;
}
this.CurrentCell = this[col + 1, row];
}
return true;
}
return base.ProcessDialogKey(keyData);
}

protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyData == Keys.Enter)
{
int col = this.CurrentCell.ColumnIndex;
int row = this.CurrentCell.RowIndex;

if (row != this.NewRowIndex)
{
if (col == (this.Columns.Count - 1))
{
col = -1;
row++;
}
this.CurrentCell = this[col + 1, row];
}
e.Handled = true;
}
base.OnKeyDown(e);
}
}






منبع: Make Enter Key Move to Next Column - MSDN Forums (http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1436914&SiteID=1)
نمونه دیگر: https://windowsclient.net/blogs/faqs/archive/2006/05/30/how-do-i-make-the-enter-key-behave-like-the-tab-key-in-a-datagrid-moving-to-the-next-cell.aspx