c # - Data Grid View Reversing Members

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har arbejdet på en formular, der præsenterer nogle specifikke elementer i en Data Grid View. Alt blev implementeret og fungerer korrekt; så besluttede jeg at ændre tingene. Jeg har brug for mange forskellige versioner af denne ene specifikke formular, så jeg lavede en basisformular, som mine andre former kan hidrøre fra. Når jeg implementerer arven af ​​denne basisformular, er dataene angivet i omvendt format. Med andre ord, før jeg lavede ændringen, blev kolonnerne opført (Spørgsmål nummer, Marked for Review, Besvares) nej, selvom, for nogen grund, dataene er angivet (Svares, Marked for Review, Question Number). Årsagen til at dette betyder, at min kode antager spørgsmålet er første række, og at oplysningerne bruges til at slå op og vise det specifikke spørgsmål.


Basisformen ser sådan ud


public partial class DataFormBase : FormBase
{
    /// <summary>
    /// Initializes a new instance of the <see cref="DataFormBase"/> class.
    /// </summary>
    public DataFormBase()
    {
        InitializeComponent();

        DrawGUI();
    }

    protected virtual void PopulateDataGrid() {}

    protected virtual void dgvData\_CellClick(object sender, DataGridViewCellEventArgs e){}

    private void dgvData\_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        dgvData.ClearSelection();
    }
}


Og implementeringen ser sådan ud


public partial class SessionReviewForm : Core.DataFormBase
{
    public QuestionSessionForm ParentSession 
    {
        get; set;
    }

    public Session Session
    {
        get; set;
    }

    public SessionPart SessionPart
    {
        get; set;
    }

    /// <summary>
    /// Shows the dialog form.
    /// </summary>
    /// <param name="session">The session.</param>
    /// <param name="sessionPart">The session part.</param>
    /// <param name="parent">The parent.</param>
    /// <returns></returns>
    public static DialogResult ShowDialogForm(Session session, SessionPart sessionPart, QuestionSessionForm parent)
    {
        // if any of the params are null get the hell out!
        if (session == null || sessionPart == null || parent == null)
            return DialogResult.None;

        // create the new form, and populate its params
        SessionReviewForm form = new SessionReviewForm()
        {
            Session = session,
            SessionPart = sessionPart,
            ParentSession = parent,
        };

        // populate the forms data grid
        form.PopulateDataGrid();

        form.Size = new System.Drawing.Size(400,400);

        // show the form
        return form.ShowDialog(parent);
    }

    /// <summary>
    /// Populates the data grid with the required information
    /// </summary>
    /// <param name="instance">The instance for the w</param>
    protected override void PopulateDataGrid()
    {
        // Get all of the questions that are marked for review
        SessionQuestions questionsToDisplay = SessionPart.SessionQuestions.GetMarkedForReview();

        // add to the list all of the questions that have not yet been answered
        questionsToDisplay.AddRange(SessionPart.SessionQuestions.GetNotAnswered());

        // create a list of objects for the data grid view
        List<SessionReviewData> objectList = new List<SessionReviewData>();

        // for each question in the session question list, populate a new member of
        // the object list
        foreach (SessionQuestion sq in questionsToDisplay)
        {
            SessionReviewData temp = new SessionReviewData
            {
                QuestionNumber = sq.Sequence + 1,
                MarkedForReview = sq.MarkForReview,
                IsAnswered = sq.IsAnswered
            };
            objectList.Add(temp);
        }

        // bind the data grid view to the object list
        dgvData.DataSource = objectList;

        // format the column headers so that they have a space between words
        for (int i = 0; i < dgvData.Columns.Count; i++)
        {
            dgvData.Columns[i].HeaderText = Utilities.AddSpacesToSentence(dgvData.Columns[i].Name);
        }
    }

    /// <summary>
    /// Handles the CellClick event of the dgvQuestions control.
    /// populates the parent form with the selected question
    /// then closes the form.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.Windows.Forms.DataGridViewCellEventArgs"/> instance containing the event data.</param>
    protected override void dgvData\_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        // if the user selects the header column, then get out.
        if (e.RowIndex == -1)
            return;

        // send the question data to the parentSession form to display the question
        ParentSession.DisplayQuestionByIndex((int)(dgvData.Rows[e.RowIndex].Cells[0].Value) - 1);

        // close this form
        Close();
    }





løst:
 Udviser Narrange var alfabetisering af min interne datastruktur, og det fik dem til at blive angivet i den forkerte rækkefølge.

Bedste reference


Kode som 'forudsætter' at noget kommer til at være et sted kan forårsage problemer.


En simpel løsning ville være at tilføje kolonnerne selv, så længe du altid vil have de samme kolonner i en bestemt rækkefølge;


dataGridView1.AutoGenerateColumns = false;
DataGridViewColumn column = new DataGridViewColumn();
        column.DataPropertyName = "Question Number";
        column.HeaderText = "Question Number";
dataGridView1.Columns.Add(column);


... så videre og så videre for hver kolonne, du vil have