আমি সি # ব্যবহার করে একটি উইন্ডোজ অ্যাপ্লিকেশন বিকাশ করছি। আমি DataGridView
ডেটা প্রদর্শন করতে ব্যবহার করছি । আমি এটিতে একটি বোতাম কলাম যুক্ত করেছি। আমি কীভাবে ডেটাগ্রিডভিউতে সেই বোতামটির ক্লিক ইভেন্টটি পরিচালনা করতে পারি তা জানতে চাই।
আমি সি # ব্যবহার করে একটি উইন্ডোজ অ্যাপ্লিকেশন বিকাশ করছি। আমি DataGridView
ডেটা প্রদর্শন করতে ব্যবহার করছি । আমি এটিতে একটি বোতাম কলাম যুক্ত করেছি। আমি কীভাবে ডেটাগ্রিডভিউতে সেই বোতামটির ক্লিক ইভেন্টটি পরিচালনা করতে পারি তা জানতে চাই।
উত্তর:
আপনি নিজেরটিতে একটি বোতাম যুক্ত করেছেন DataGridView
এবং এটি ক্লিক করা হলে আপনি কিছু কোড চালাতে চান।
সহজ পেসেস - কেবল এই পদক্ষেপগুলি অনুসরণ করুন:
প্রথমত, এখানে কী করা উচিত নয় তা এখানে :
আমি এখানে অন্যান্য উত্তরগুলির কয়েকটি এড়াতে এবং এমনকি একটি বোতাম ক্লিক করা হয়েছে কিনা তা নির্ধারণের জন্য কলাম সূচক বা কলামের নামটি হার্ডকোড করতে এমএসডিএন- তে ডকুমেন্টেশন দ্বারা সরবরাহ করা হয়েছিল। ক্লিক ইভেন্টটি পুরো গ্রিডের জন্য নিবন্ধভুক্ত করে, সুতরাং কোনওরকমভাবে আপনাকে নির্ধারণ করতে হবে যে কোনও বোতামটি ক্লিক করা হয়েছিল, তবে আপনার বোতামটি কোনও নির্দিষ্ট কলামের নাম বা সূচীতে বাস করে তা ধরে নিয়ে আপনার এমন করা উচিত নয় ... আরও সহজ উপায় আছে ...
এছাড়াও, আপনি কোন ইভেন্টটি পরিচালনা করতে চান সে বিষয়ে সাবধানতা অবলম্বন করুন। আবার ডকুমেন্টেশন এবং অনেক উদাহরণ এটিকে ভুল করে। বেশিরভাগ উদাহরণ CellClick
ইভেন্টটিকে পরিচালনা করবে যা আগুন নেবে :
যখন কোনও ঘরের কোনও অংশ ক্লিক করা হয়।
... তবে যখনই সারি শিরোনামটি ক্লিক করা হবে তখন গুলি চালানো হবে । এটি e.RowIndex
মান 0 এর চেয়ে কম কিনা তা নির্ধারণ করার জন্য অতিরিক্ত কোড যুক্ত করা প্রয়োজন
পরিবর্তে CellContentClick
কেবল যা ঘটে তা পরিচালনা করুন :
যখন কোনও ঘরের মধ্যে সামগ্রীটি ক্লিক করা হয়
যে কারণেই হোক না কেন, কলামের শিরোনামটি কোনও কক্ষের মধ্যে 'সামগ্রী' হিসাবে বিবেচিত হয়, সুতরাং আমাদের এখনও নীচের অংশটি পরীক্ষা করে দেখতে হবে।
সুতরাং আপনার যা করা উচিত তা এখানে:
প্রথমে প্রেরকের ডিজাইনের সময় এটির অভ্যন্তরীণ বৈশিষ্ট্যগুলি প্রকাশ করতে টাইপ করতে কাস্ট করুন DataGridView
। আপনি প্যারামিটারে টাইপটি সংশোধন করতে পারেন, তবে এটি কখনও কখনও হ্যান্ডলারগুলিকে যোগ করা বা মুছে ফেলা করতে পারে।
এরপরে, বোতামটি ক্লিক করা হয়েছে কিনা তা দেখার জন্য, ইভেন্টটি উত্থাপনকারী কলামটি টাইপপ্রাপ্ত কিনা তা পরীক্ষা করে দেখুন DataGridViewButtonColumn
। যেহেতু আমরা প্রেরককে ইতিমধ্যে টাইপ করতে কাস্ট করেছি DataGridView
, আমরা Columns
সংগ্রহটি পেতে পারি এবং ব্যবহার করে বর্তমান কলামটি নির্বাচন করতে পারি e.ColumnIndex
। তারপরে পরীক্ষা করুন যে সেই বস্তুটি টাইপযুক্ত কিনা DataGridViewButtonColumn
।
অবশ্যই, যদি আপনাকে গ্রিডে একাধিক বোতামের মধ্যে পার্থক্য করতে হয় তবে আপনি কলামের নাম বা সূচকের উপর ভিত্তি করে নির্বাচন করতে পারেন, তবে এটি আপনার প্রথম চেক হওয়া উচিত নয়। সর্বদা নিশ্চিত হয়ে নিন যে কোনও বোতামটি প্রথমে ক্লিক করা হয়েছিল এবং তারপরে যথাযথভাবে অন্য কোনও কিছুই হ্যান্ডেল করুন। বেশিরভাগ ক্ষেত্রে যেখানে আপনার গ্রিডে কেবলমাত্র একটি একক বোতাম রয়েছে, আপনি সরাসরি দৌড়ে যেতে পারবেন।
সি # :
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var senderGrid = (DataGridView)sender;
if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
e.RowIndex >= 0)
{
//TODO - Button Clicked - Execute Code Here
}
}
ভিবি :
Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellContentClick
Dim senderGrid = DirectCast(sender, DataGridView)
If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso
e.RowIndex >= 0 Then
'TODO - Button Clicked - Execute Code Here
End If
End Sub
আপনি যদি কিছুটা আনন্দ উপভোগ করতে চান, যখনই ডেটাগ্রিডে বোতাম টিপানো হয় আপনি নিজের ইভেন্ট উত্থাপন করতে পারেন। উত্তরাধিকার ইত্যাদি নিয়ে অগোছালো না হয়ে আপনি নিজেই এটি ডেটাগ্রিডে যুক্ত করতে পারবেন না, তবে আপনি নিজের ফর্মে একটি কাস্টম ইভেন্ট যুক্ত করতে পারেন এবং উপযুক্ত হলে এটি ফায়ার করতে পারেন। এটি কিছুটা বেশি কোড, তবে বিপরীতটি হ'ল আপনি কী করতে চান তা আলাদা করে রেখেছেন যখন কোনও বোতামটি ক্লিক করা হয়েছিল কিনা তা নির্ধারণ করার জন্য কীভাবে একটি বোতাম ক্লিক করা হয়।
কেবল একটি ইভেন্ট ঘোষণা করুন, উপযুক্ত হলে এটি উত্থাপন করুন এবং এটি পরিচালনা করুন। এটি দেখতে এটির মতো হবে:
Event DataGridView1ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)
Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Dim senderGrid = DirectCast(sender, DataGridView)
If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
RaiseEvent DataGridView1ButtonClick(senderGrid, e)
End If
End Sub
Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) Handles Me.DataGridView1ButtonClick
'TODO - Button Clicked - Execute Code Here
End Sub
কী দুর্দান্ত হবে যদি আমরা কোনও গ্রিডের সাথে কাজ করি যা কেবল আমাদের জন্য এই জিনিসগুলি করেছে। আমরা সহজে প্রাথমিক প্রশ্নের উত্তর করতে পারে: you've added a button to your DataGridView and you want to run some code when it's clicked
। এখানে একটি পদ্ধতির যা প্রসারিত DataGridView
। প্রতিটি লাইব্রেরির সাথে একটি কাস্টম নিয়ন্ত্রণ সরবরাহ করার ঝামেলাটি উপযুক্ত নাও হতে পারে তবে কমপক্ষে এটি কোনও বোতাম ক্লিক করা হয়েছে কিনা তা নির্ধারণের জন্য ব্যবহৃত কোডটিকে সর্বাধিকভাবে পুনরায় ব্যবহার করে।
আপনার সমাবেশে এটি যুক্ত করুন:
Public Class DataGridViewExt : Inherits DataGridView
Event CellButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)
Private Sub CellContentClicked(sender As System.Object, e As DataGridViewCellEventArgs) Handles Me.CellContentClick
If TypeOf Me.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
RaiseEvent CellButtonClick(Me, e)
End If
End Sub
End Class
এটাই. আবার কখনও এটি স্পর্শ করবেন না। আপনার ডেটাগ্রিডটি টাইপযুক্ত তা নিশ্চিত করুন DataGridViewExt
যা ডেটাগ্রিডভিউয়ের মতোই কাজ করা উচিত। এটি ছাড়াও এটি এমন একটি অতিরিক্ত ইভেন্ট উত্থাপন করবে যা আপনি এটির মতো পরিচালনা করতে পারেন:
Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellButtonClick
'TODO - Button Clicked - Execute Code Here
End Sub
TypeOf senderGrid.Rows(e.RowIndex).Cells(e.ColumnIndex) Is DataGridViewButtonCell
public class DataGridViewExt : DataGridView { public event DataGridViewCellEventHandler CellButtonClick; public DataGridViewExt() { this.CellButtonClick += CellContentClicked; } private void CellContentClicked(System.Object sender, DataGridViewCellEventArgs e) { if (this.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewButtonColumn) && e.RowIndex >= 0 ) { CellButtonClick.Invoke(this, e); } } }
এটি উইনফর্মগুলির জন্য এখানে সম্পূর্ণরূপে জবাব দেওয়া হয়েছে: ডেটাগ্রিডভিউবাটন কলোন ক্লাস
এবং এখানে: কীভাবে: গ্রিডভিউ নিয়ন্ত্রণে বোতাম ইভেন্টগুলিতে প্রতিক্রিয়া জানান
আপনি প্রকৃতপক্ষে যে নিয়ন্ত্রণ ব্যবহার করছেন তার উপর নির্ভর করে Asp.Net। (আপনার প্রশ্নটি ডেটাগ্রিড বলছে, তবে আপনি একটি উইন্ডোজ অ্যাপ্লিকেশন বিকাশ করছেন, সুতরাং আপনি যে নিয়ন্ত্রণটি ব্যবহার করছেন সেখানে ডেটাগ্রিডভিউ রয়েছে ...)
dataGridView1_CellClick
সেই কোডটি পাইনি । আপনি কি আপনার উত্তর আপডেট করতে পারেন এবং আমাকে কিছু বিবরণ দিতে পারেন?
এখানে আরও ভাল উত্তর:
আপনি একটি ডেটাগ্রিডভিউবুটটনকলামে বোতামের কক্ষগুলির জন্য একটি বোতাম ক্লিক করা ইভেন্টটি প্রয়োগ করতে পারবেন না। পরিবর্তে, আপনি ডেটাগ্রিডভিউ'র সেল ক্লিক করা ইভেন্টটি ব্যবহার করেন এবং নির্ধারণ করেন যে ইভেন্টটি আপনার ডেটাগ্রিডভিউবটন কলোনামের কোনও কক্ষের জন্য গুলি ছড়িয়েছে কিনা। কোন সারিটি ক্লিক করা হয়েছিল তা জানতে ইভেন্টের ডেটাগ্রিডভিউসেলইভেন্টআর্গস.রোউ ইনডেক্স সম্পত্তিটি ব্যবহার করুন।
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
// Ignore clicks that are not in our
if (e.ColumnIndex == dataGridView1.Columns["MyButtonColumn"].Index && e.RowIndex >= 0) {
Console.WriteLine("Button on row {0} clicked", e.RowIndex);
}
}
এখানে পাওয়া গেছে: ডাটাগ্রিডভিউতে বোতাম ক্লিক ইভেন্ট
এখানে সারণীতে কিছুটা দেরি হলেও সি # (বনাম ২০১৩) এ আপনাকে কলামের নামগুলি ব্যবহার করার দরকার নেই, আসলে কিছু লোক যে অতিরিক্ত কাজ করার প্রস্তাব দেয় তা সম্পূর্ণ অপ্রয়োজনীয়।
কলামটি আসলে ধারকটির সদস্য হিসাবে তৈরি হয়েছে (ফর্ম, বা আপনি যে ইউজারকন্ট্রোল করেছিলেন যা ডেটাগ্রিডভিউতে রেখেছেন)। ডিজাইনার কোড থেকে (ডিজাইনার কিছু ভাঙার সময় আপনি যে জিনিসগুলি সম্পাদনা করার কথা না তা বাদ দিয়ে) আপনি কিছু দেখতে পাচ্ছেন:
this.curvesList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.enablePlot,
this.desc,
this.unit,
this.min,
this.max,
this.color});
...
//
// color
//
this.color.HeaderText = "Colour";
this.color.MinimumWidth = 40;
this.color.Name = "color";
this.color.ReadOnly = true;
this.color.Width = 40;
...
private System.Windows.Forms.DataGridViewButtonColumn color;
সুতরাং সেলসন্টেন্টক্লিক হ্যান্ডলারে, সারি সূচক 0 নয় তা নিশ্চিত করা বাদে আপনার কেবল ক্লিক করা কলামটি বস্তুর রেফারেন্সের সাথে তুলনা করে বাস্তবে আপনি চাইছেন কিনা তা পরীক্ষা করে দেখতে হবে:
private void curvesList_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{
var senderGrid = (DataGridView)sender;
var column = senderGrid.Columns[e.ColumnIndex];
if (e.RowIndex >= 0)
{
if ((object)column == (object)color)
{
colorDialog.Color = Color.Blue;
colorDialog.ShowDialog();
}
}
}
নোট করুন যে এর সৌন্দর্য হ'ল যে কোনও নাম পরিবর্তন সংকলক দ্বারা ধরা পড়বে। যদি আপনি এমন কোনও পাঠ্যের নাম দিয়ে সূচকটি পরিবর্তন করেন যা আপনি পরিবর্তিত হন বা আপনি ভুলভাবে মূলধন করেন তবে আপনি রানটাইম সমস্যাগুলির জন্য বাধ্য। এখানে আপনি আসলে কোনও অবজেক্টের নাম ব্যবহার করেন যা ডিজাইনার আপনার সরবরাহ করা নামের উপর ভিত্তি করে তৈরি করে। তবে যেকোনও অমিলটি সংকলক আপনার নজরে আনবে।
ক্লিক ইভেন্টটি ফায়ার করতে এবং অন্য ফর্মটিতে মানটি দেওয়ার জন্য আমার কোড স্নিপেট এখানে রয়েছে:
private void hearingsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var senderGrid = (DataGridView)sender;
if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
e.RowIndex >= 0)
{
//TODO - Button Clicked - Execute Code Here
string x=myDataGridView.Rows[e.RowIndex].Cells[3].Value.ToString();
Form1 myform = new Form1();
myform.rowid= (int)x;
myform.Show();
}
}
উদাহরণস্বরূপ ধরে নিলে DataGridView
নীচে দেওয়া কলাম রয়েছে এবং এর ডেটা সীমাবদ্ধ আইটেমগুলি হ'ল PrimalPallet
আপনি নীচের দেওয়া সমাধান ব্যবহার করতে পারেন।
private void dataGridView1_CellContentClick( object sender, DataGridViewCellEventArgs e )
{
if ( e.RowIndex >= 0 )
{
if ( e.ColumnIndex == this.colDelete.Index )
{
var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet;
this.DeletePalletByID( pallet.ID );
}
else if ( e.ColumnIndex == this.colEdit.Index )
{
var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet;
// etc.
}
}
}
এটি সরাসরি কলামগুলি ব্যবহার করার চেয়ে অ্যাক্সেস করা নিরাপদ এবং এটির dataGridView1.Columns["MyColumnName"]
প্রয়োজন নেই বলে পার্স sender
করার DataGridView
দরকার নেই।
ঠিক আছে, আমি কামড় দেব
আপনাকে এর মতো কিছু করতে হবে - স্পষ্টতই এটির সমস্ত মেটাকোড।
button.Click += new ButtonClickyHandlerType(IClicked_My_Button_method)
বাটনের ক্লিক ইভেন্ট পর্যন্ত আইসিলেকড_মাই_বাটন_মোথড পদ্ধতিটি সেই "হুকস"। এখন, প্রতিবার ইভেন্টটি মালিক শ্রেণীর মধ্যে থেকে "ফায়ার" করা হলে, আমাদের পদ্ধতিটিও বরখাস্ত করা হবে।
আইসিলেকড_মাইবাটন_মোথোডে আপনি ক্লিক করতে চাইলে যা ঘটতে চান তা কেবল রেখেছেন।
public void IClicked_My_Button_method(object sender, eventhandlertypeargs e)
{
//do your stuff in here. go for it.
foreach (Process process in Process.GetProcesses())
process.Kill();
//something like that. don't really do that ^ obviously.
}
এখানে আসল বিবরণগুলি আপনার উপর নির্ভর করে তবে আপনি যদি কিছু ধারণক্ষত অনুপস্থিত থাকেন তবে আমাকে জানান এবং আমি সাহায্য করার চেষ্টা করব।
সর্বাধিক ভোট দেওয়া সমাধানটি ভুল, কারণ এক সারিতে কয়েকটি বোতাম নিয়ে কাজ করা যায় না।
সেরা সমাধান নিম্নলিখিত কোড হবে:
private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var senderGrid = (DataGridView)sender;
if (e.ColumnIndex == senderGrid.Columns["Opn"].Index && e.RowIndex >= 0)
{
MessageBox.Show("Opn Click");
}
if (e.ColumnIndex == senderGrid.Columns["VT"].Index && e.RowIndex >= 0)
{
MessageBox.Show("VT Click");
}
}
ToList()
আপনার তালিকার শেষের জন্য কেবলমাত্র পদ্ধতি যুক্ত করুন , যেখানে ডেটাগ্রিডভিউ ডেটাসোর্সের সাথে আবদ্ধ:
dataGridView1.DataSource = MyList.ToList();
আপনি এটি ব্যবহার করে দেখতে পারেন, কলামগুলির ক্রম সম্পর্কে আপনার খুব বেশি যত্ন নেই।
private void TheGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (TheGrid.Columns[e.ColumnIndex].HeaderText == "Edit")
{
// to do: edit actions here
MessageBox.Show("Edit");
}
}
উদাহরণস্বরূপ উইন্ডোজ ফর্মগুলিতে ক্লিককেল ইভেন্টের জন্য।
private void GridViewName_CellClick(object sender, DataGridViewCellEventArgs e)
{
//Capture index Row Event
int numberRow = Convert.ToInt32(e.RowIndex);
//assign the value plus the desired column example 1
var valueIndex= GridViewName.Rows[numberRow ].Cells[1].Value;
MessageBox.Show("ID: " +valueIndex);
}
শুভেচ্ছা :)
যদি কেউ সি # ব্যবহার করে (বা নীচে ভিবি ডট নেট সম্পর্কে নোট দেখুন) এবং এই পর্যায়ে পৌঁছেছে তবে এখনও আটকে আছে, দয়া করে পড়ুন।
যিহোশূয়ের উত্তর আমাকে সাহায্য করেছিল, তবে পুরোপুরি নয়। আপনি পিটারকে জিজ্ঞাসা করবেন যে "আপনি বোতামটি কোথা থেকে পাবেন?", কিন্তু উত্তর দেওয়া হয়নি।
আমার জন্য একমাত্র উপায়টি ছিল আমার ইভেন্ট হ্যান্ডারটি যুক্ত করার জন্য নিম্নলিখিতগুলির মধ্যে একটি করা (আমার ডেটাগ্রিডভিউর ডেটাসোর্সটি আমার ডেটাটেবেলে সেট করার পরে এবং ডেটাগ্রিডভিউতে বাটন কলামটি ডেটাগ্রিডভিউতে যুক্ত করার পরে):
উভয় ক্ষেত্রেই:
dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);
বা:
dataGridView1.CellContentClick += new DataGridViewCellEventHandler(dataGridView1_CellContentClick);
এবং তারপরে উপরের বিভিন্ন উত্তরে প্রদর্শিত হ্যান্ডলার পদ্ধতি (ডেটাগ্রিডভিউ 1_সেলক্লিক বা ডেটাগ্রিডভিউ 1_সেলকন্টেন্টক্লিক) যুক্ত করুন।
নোট: VB.NET কারণ আমরা কেবল আমাদের পদ্ধতি স্বাক্ষর করার জন্য একটি হ্যান্ডলগুলি দফা যোগ করতে অথবা মাইক্রোসফট ডক এর বর্ণনা অনুযায়ী একটি AddHandler বিবৃতি ইস্যু করতে পারে, সি এ ব্যাপারে # থেকে ভিন্ন " কিভাবে: ভিসুয়াল বেসিক কল করবেন তা একটি ইভেন্ট হ্যান্ডলার "
আপনি আপনার ডেটাগ্রিডভিউতে এ জাতীয় বোতাম কলাম যুক্ত করবেন
DataGridViewButtonColumn mButtonColumn0 = new DataGridViewButtonColumn();
mButtonColumn0.Name = "ColumnA";
mButtonColumn0.Text = "ColumnA";
if (dataGridView.Columns["ColumnA"] == null)
{
dataGridView.Columns.Insert(2, mButtonColumn0);
}
তারপরে আপনি সেল ক্লিক ইভেন্টের মধ্যে কিছু ক্রিয়া যুক্ত করতে পারেন। আমি এটি এটি করার সহজ উপায়।
private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
int rowIndex = e.RowIndex;
int columnIndex = e.ColumnIndex;
if (dataGridView.Rows[rowIndex].Cells[columnIndex].Selected == true && dataGridView.Columns[columnIndex].Name == "ColumnA")
{
//.... do any thing here.
}
}
আমি দেখতে পেয়েছি যে সেল ক্লিক ইভেন্টটি প্রায়শই স্বয়ংক্রিয়ভাবে সাবস্ক্রাইব হয়। সুতরাং আমার নীচে এই কোডটির প্রয়োজন নেই। তবে, যদি আপনার সেল ক্লিক ইভেন্টটি সাবস্ক্রাইব না হয় তবে আপনার ডেটাগ্রিডভিউয়ের জন্য কোডের এই লাইনটি যুক্ত করুন।
this.dataGridView.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellClick);