مثلا عندي ثلاثة أعمدة رقم و اسم و العمر
أنا أريد عندما أضغط على العمود الأول enter يظهر البيانات الباقية اوتوماتيك وهكذا ممكن مساعدة
مثلا عندي ثلاثة أعمدة رقم و اسم و العمر
أنا أريد عندما أضغط على العمود الأول enter يظهر البيانات الباقية اوتوماتيك وهكذا ممكن مساعدة
طيب يا أخي وين أنت وصلت يعني أين توقفت ولم تستطع المواصلة
ضع الكود الذي يظهر نتائج غير متوقعه أو خطأ
أو أرفق المشروع للنظر فيه . بالتوفيق إن شاء الله
في المثال يتضح المقال
انا ماعندي مشكلة في إظهار البيانات للأعمدة الأخرى و لكن المشكلة معي عندما أضغط enter للcell للعمود الأول لا يظهر data في الأعمدة الأخرى لأنه لا يأخد الحدث
Private Sub DataGrid1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.CurrentCellChanged
dim i as New as
Dim r, c As Integer
c = DataGrid1.CurrentCell.ColumnNumber
If (c = 0) Then
r = DataGrid1.CurrentCell.RowNumber
DataGrid1(r, c + 1) = "hab"
End If
End Sub
كيف أستطيع أضيف أمر الضغط على enter
السلام عليكم
في هذه الحالة يلزم أن نستخدم الوظيفة ProcessCmdKey لمعرفة هل تم الضغط على الزر Enter
كذلك يلزمنا أن نعرف هل نحن في العامود الأول في الـ DataGrid بلا شك عن طريق إنشاء بعض المتغيرات الرقمية و متغير منطقي واحد سيكون بهذا الشكل على إفتراض أنك أدرجت الحاوية Imports System.Data.OleDb
Dim flag As Boolean = False
Dim Value%, R%, C%
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.da.Fill(Ds1, "tb")
Me.DataGrid1.DataSource = Ds1
Me.DataGrid1.DataMember = "tb"
End Sub
Protected Overrides Function ProcessCmdKey _
(ByRef msg As System.Windows.Forms.Message, _
ByVal keyData As System.Windows.Forms.Keys) As Boolean
Try
If msg.WParam.ToInt32() = CInt(Keys.Enter) Then
If flag Then
LoadReleatedData(Value)
End If
SendKeys.Send("{Tab}")
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Function
Private Sub DataGrid1_CurrentCellChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles DataGrid1.CurrentCellChanged
R = Me.DataGrid1.CurrentCell.RowNumber
C = Me.DataGrid1.CurrentCell.ColumnNumber
If Me.DataGrid1.CurrentCell.ColumnNumber = 0 Then
Value = Me.DataGrid1(R, C)
flag = True
Else
flag = False
End If
End Sub
Private Sub LoadReleatedData(ByVal Key As Integer)
Me.DataGrid1.DataBindings.Clear()
Dim strSQL As String
Try
cnn.Open()
strSQL = "SELECT * FROM tb WHERE Login_ID =" & Key
Dim cmd As New OleDbCommand(strSQL, cnn)
da.SelectCommand = cmd
da.Fill(Ds1, "tb")
Me.DataGrid1.DataSource = Ds1
cmd.Dispose()
Catch ex As Exception
Throw ex
Finally
cnn.Close()
End Try
End Subملاحظة إذا كنت لا ترغب بأن يذهب المؤشر للعامود الثاني فقط أرجع القيمة false في الوظيفة ProcessCmdKey
بهذا الشكل
المشكلة :
طيب فيه مشكلة واحده هي أن الـ DataGrid تكون في حالة تركيز Focus فيتطلب الضغط مرة أو أخرى بالنسبة للصف الأول فقط
للمزيد عن هذه المشكلة إقراء هذا
There appears to be no method to turn off a currentcell. When a cell is being edited, it is the TextBox embedded in the columnstyle that has the focus, and is displaying the highlighted text. You will notice in this situation, if you click the grid's title bar above the column headers, this TextEdit control loses focus, and the datagrid appears to have no current cell.
We can simulate this click from code, and use it to expose a method in our datagrid to SetNoCurrentCell. Below is some code to illustrate this idea.
protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m)
{
Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;
if((m.Msg == WM_KEYDOWN || m.Msg == WM_KEYUP)
&& keyCode == Keys.Enter )
return false;
return true;
}والله أعلم
في المثال يتضح المقال
حلك جميل يا ( الغملاسي) وانا حاولت بطريقة اخرى تعتمد على Northwind كقاعدة بيانات
لتجربة المثال أدخل alfki في العمود الاول و من ثم Enter
وهذا المثال....
هذا الموضوع مغلق.