سؤال

وأنا أحاول ربط خلايا تحرير وسرد منفصلة داخل داتاغريدفيف إلى فئة مخصصة، والحفاظ على الحصول خطأ

<اقتباس فقرة>   

وقيمة DataGridViewComboBoxCell غير صالحة

وأنا تعيين حاليا مصدر البيانات للخلية إلى IList<ICustomInterface> من قاموس عندي. على تحديد مصدر البيانات ومع ذلك، لم يتم تعيين مؤشر للComboBoxCell، لذلك له قيمة غير صالحة المحدد.

وأنا في محاولة لمعرفة كيفية الحصول عليها لتحديد القيمة الحقيقية، على سبيل المثال البند 0TH ضمن قائمة تم منحها لإزالة هذا الخطأ، أو إيجاد طريقة أخرى لحل المشكلة. أي شخص لديه أي اقتراحات؟

هل كانت مفيدة؟

المحلول

وتمكنت من العثور على حل لم يمض وقت طويل بعد نشر هذه المساله. لأي شخص آخر:

وكانت المشكلة التي كنت أحاول أن تعيين DataGridViewComboBoxCell.Value إلى كائن، متوقعا ان كان لا بد لخلية لمصدر البيانات التي سوف تجد تلقائيا الكائن في المصدر والتحديث.

وهذا لم يكن واقع الحال، تحتاج فعلا لتعيين قيمة مساوية لتلك التي للممتلكات ValueMember لذلك لتحديث قيمة وملزمة بشكل صحيح. أعتقد أنه تم استخدام خاصية 'الاسم' لكل من ValueMember وDisplayMember (الضوابط كيف يجعل في الخلية) حتى وضع قيمة لinterface.ToString() (بدلا من المثال واجهة) يعمل في معظم الحالات. ثم أمسكت وتجاهل أي استثناءات DataError التي تحدث بينما أنا تغيير مصدر حولها.

نصائح أخرى

وهنا قال لي حل بسيط عند استخدام تتضمن التعدادات

ColumnType.ValueType = typeof (MyEnum);
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum));

ويمكنك أن تفعل ذلك فقط بعد "InitializeComponent ()؛"

والحلوى للساعة من التجارب، وأخيرا وجدت الحل الذي يعمل.

// Create a DataGridView
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView();

// Create a DataGridViewComboBoxColumn
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new 

System.Windows.Forms.DataGridViewComboBoxColumn();

// Add the DataGridViewComboBoxColumn to the DataGridView
dgvCombo.Columns.Add(colCombo);

// Define a data source somewhere, for instance:
public enum DataEnum
{
    One,
    Two,
    Three
}

// Bind the DataGridViewComboBoxColumn to the data source, for instance:
colCombo.DataSource = Enum.GetNames(typeof(DataEnum));

// Create a DataGridViewRow:
DataGridViewRow row = new DataGridViewRow();

// Create a DataGridViewComboBoxCell:
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell();

// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn:
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum));

// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance:
cellCombo.Value = "Two";
// (No need to set values for DisplayMember or ValueMember.)

// Add the DataGridViewComboBoxCell to the DataGridViewRow:
row.Cells.Add(cellCombo);

// Add the DataGridViewRow to the DataGridView:
dgvCombo.Rows.Add(row);

// To avoid all the annoying error messages, handle the DataError event of the DataGridView:
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError);

void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    // (No need to write anything in here)
}

وهذا هو كل شيء.

وكان لي نفس المشكلة.

في حالتي كان الحل لملء محول البيانات من جدول المفتاح الأجنبي. لم يتم ملؤه ذلك تلقائيا، وهذا هو سبب المشكلة.

في الحدث Page_Load:

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes)

وأنا أواجه نفس المشكلة. بعد ملء العمود تحرير وسرد لي في (unbouod) DataGrid، أنا تحل مشكلتي عن طريق تعيين الخاصية ValueMember من DataGridViewComboBoxColumn على ما يبدو، الاعتماد فقط على الممتلكات ToString() الكائنات في تحرير وسرد ليست كافية.

ورمز الفعلي:

/// <summary>
/// Populate the dataGridSplitVolumes data grid with all existing qualifications for the plan.
/// </summary>
/// <param name="bonus"></param>
private void PopulateDataGridSplitVolumes(Bonus_Group bonus)
{
  try
  {
    List<Qualification> qualifications = Qualification.Load(this.groupBonus.PlanID, this.ConnectionString);
    foreach (Qualification qual in qualifications)
    {
      DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)this.dataGridSplitVolumes.Columns[0];
      col.Items.Add(qual);                    
    }
    SplitVolumeGrid_QualificationColumn.ValueMember = "Name";
  }
  catch (Exception ex)
  {
#if DEBUG
    System.Diagnostics.Debugger.Break();
#endif
    throw ex;
  }
}//PopulateDataGridSplitVolumes     

واستخدام DataError حدث معالج،

private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            //You don't have to write anything here !
        }

ووالخاص DisplayMember وValueMember نوع البيانات يجب أن تكون هي نفسها، في حالتي لدي COUNTRYNAME على حد سواء. كل شيء يعمل بشكل جيد بالنسبة لي ... !!

وتعيين قيمة فارغة إلى الخلية:

dataGridView.CurrentRow.Cells[NAME].Value = null;

لمصلحة من الناس لا تكافح بقدر ما فعلت.

عند ربط السرد كنت وضع DisplayMember (ما سيرى المستخدم) وValueMember (ما سوف تحصل على طلبك).

وبعد إعداد هذه تحتاج إلى إعداد القيمة وهذا هو المكان الذي فشل. في الأساس نوع من القيمة يجب أن يكون على نفس نوع ValueMember.

وحتى إذا كان عضوا القيمة الخاص بك هو معرف الواضح لها من نوع INT وتحتاج إلى تعيين قيمة لكثافة العمليات على سبيل المثال Cell.Value = 1؛.

وكنت أعاني من نفس المشكلة. وكانت الرسالة 100٪ على الفور. وكانت قيم منسدل مثل: الدقيق، StartsWith ... وكنت أحاول أن تعيين قيمة EXACTA (ليس بالضبط). كان هذا يحدث تلقائيا وأنا أقرأ في DataTable ولداتاغريدفيف من ملف. xml مع DataTable.ReadXml (...). كانت القيم في ملف. xml قبالة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top